With

Adam Boduch

With - instrukcja wiążąca

Instrukcja with jest przeważnie używana wraz z rekordami lub obiektami. Nie pełni ona żadnej znaczącej roli ? uwalnia za to programistę od pisania zbędnego kodu. Załóżmy, że program zawiera następujący rekord:

var
  Rec : packed record
  X, Y : Integer;
  Imię : String[20];
  Nazwisko : String[20];
  Wiek : Byte;
end;

Prawidłowe wypełnienie rekordu jest przedstawione poniżej:

  
Rec.X := 12;
Rec.Y := 24;
Rec.Imię := 'Jan';
Rec.Nazwisko := 'Kowalski';
Rec.Wiek := 20;

Dzięki zastosowaniu instrukcji wiążącej with kod ten można skrócić do następującej postaci:

  
with Rec do
begin
  X := 12;
  Y := 24;
  Imię := 'Jan';
  Nazwisko := 'Kowalski';
  Wiek := 20;
end;

Instrukcja with jest bardzo często używana przy tworzeniu dynamicznych obiektów, głównie okien. Zamiast pisać:

procedure Foo;
var 
  F: TForm;
begin
  F := TForm.Create(Self);
  F.Top := 40;
  F.Left := 57;
  (...)
  F.Show;
end; 

można napisać:

procedure Foo;
begin
  with TForm.Create(Self) do 
  begin
    Top := 40;
    Left := 57;
    (...)
    Show;
  end;
end; 

Uwaga

<font color="red">Użycie "with" przysłania funkcje o identycznych nazwach w danym module, przez co dostęp do formularza i innych obiektów nadrzędnych jest tylko przez nazwę bądź self..</span> NP : ```delphi var Obszar : Trect; ..... With Obszar do Left := 20; // Ustala left zmiennej "Obszar" a nie np Formy Top := 10; end; ```

Zobacz też:

1 komentarz

Przy użyciu with można dokonać pewnych optymalizacji np. jeśli wywołujemy metodę z tym samym parametrem kilka razy zamiast pisać

Dokument.Szukaj('<jakis tag>').Szukaj('<inny tag>').SzukajAtrybutu('atrubut1').WyswietlZawartosc;
Dokument.Szukaj('<jakis tag>').Szukaj('<inny tag>').SzukajAtrybutu(' atrubut2').WyswietlZawartosc;
Dokument.Szukaj('<jakis tag>').Szukaj('<inny tag>').SzukajAtrybutu(' atrubut3').WyswietlZawartosc;
Dokument.Szukaj('<jakis tag>').Szukaj('<inny tag>').SzukajAtrybutu(' atrubut4').WyswietlZawartosc;

można to samo zapisać tak:

with Dokument.Szukaj('<jakis tag>').Szukaj('<inny tag>') do
begin
  SzukajAtrybutu('atrubut1').WyswietlZawartosc;
  SzukajAtrybutu('atrubut2').WyswietlZawartosc;
  SzukajAtrybutu('atrubut3').WyswietlZawartosc;
  SzukajAtrybutu('atrubut4').WyswietlZawartosc;
end;

w ten sposób nie musimy czekać na kilkukrotne przetworzenie metody Szukaj tylko operujemy na wcześniej zwróconym rezultacie