Właściwość obiektu jako parametr var

0

Jest sobie procedura, która coś tam robi... wyniki jej działania są zwracane na bieżąco przez referencję (var Info).
Prosty przykład:

procedure SkanujDysk(Drive: char; var Info: string);
begin
  repeat ...
    //skanuje dysk...
    Info := 'Aktualnie skanowany katalog to ...';
  until...
end;

Wywołanie:

var
  StatusBar: TStatusBar; 

begin
  SkanujDysk("C:", StatusBar.SimpleText);
end;

Niestety to nie zadziała. Nie chciałbym przekazywać całego obiektu TStatusBar do procedury, gdyż to ma być uniwersalne i w przyszłości mogę tam podać jako parametr np Label1.Text. Ogólnie można przyjąć parametr var jako TObject ale wtedy znowu nie podam zwykłej zmiennej typu string... Jak byście to rozwiązali? Procedura będzie zamknięta w oddzielnej bibliotece i nie chce się z tej procedury odwoływać do StatusBar np. przez

Form1.StatusBar1...

bo przecież nie o to chodzi...

0

A nie możesz zrobić tak:

var
  StatusBar: TStatusBar;
  Text:string;
begin
  SkanujDysk("C:", Text);
  StatusBar.SimpleText:=Text;
end;

Przekazywać właściwości obiektu się da (istnieje funkcja FieldAddress), ale należy wystrzegać się takiego podejścia jako niebezpiecznego. Dlaczego? Ponieważ często (właściwie to prawie zawsze) właściwości komponentu nie są bezpośrednio polami w obiekcie, ale funkcjami przypisania/odczytu z pól.

0

Niestety, ale tym sposobem otrzymamy tylko komunikat wtedy, kiedy procedura skończy skanować dysk... A ma ona przecież pokazywać aktualny stan skanowania dysku w czasie działania procedury.

0

To zrób jakąś procedurkę w stylu callback i podawaj jej adres do Twojej funkcji. A procedurka to zrobi dokładnie przypisanie tekstu.

0

Hmm, to jest jakaś myśl. Callback obsługujący np. moje zdarzenie ON_STATUS_CHANGE :P Dzięki :)

0

Zrobiłem coś takiego:

type
  TStatus = procedure(Status: String);

procedure Scan(Drive: Char; Status: TStatus);
var
  n: Integer;
begin
  for n:=0 to 3 do
  begin
     Status(IntToStr(n));
     Sleep(200);
  end;
end;

procedure Proc(Status: String);
begin
  Form1.StatusBar1.SimpleText := Status;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Scan('C', Proc);
end;
0

a sprobuj cos takiego

procedure SkanujDysk(Drive: char);
begin
repeat ...
//skanuje dysk...
Form1.StatusBar1.SimpleText:= 'Aktualnie skanowany katalog to ...';
Aplication.ProcessMessages;
until...
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0