Dynamiczny komponent + procedury

0

Witam,

Jeżeli dynamicznie utworze sobie ListView to w jaki sposób powiązać ja z procedurami np. menu popup. Wiem, że ma to wyglądać tak:

SLV.popupmenu := PopupMenu3;
SLV.onClick := SystemListView1Click;

Jednak, gdy chciałbym wykonać poniższą procedurę na tworzonym dynamicznie komponencie to wyrzuca mi błąd podczas kompilacji.

dfsSystemListView1 - komponent tworzony dynamicznie

procedure TForm1.KopiujClick(Sender: TObject);
var
I: Integer;
FullName: String;
FullPath: String;
<begin
for I:= dfsSystemListView1.Items.Count - 1 downto 0 do
begin
FullName:=ExtractFileName(dfsSystemListView1.Items.Item[I].Caption);
FullPath:=IsDir(dfsSystemTreeView1.Directory) + FullName;

if CheckListBox2.Items.IndexOf(FullPath) < 0 then
CheckListBox2.Items.Add(FullPath);

end;

W jaki sposób ten problem rozwiązać?

Z góry dziękuję za pomoc,
Piotr Murawski

0

Może begin wstawić? Bo w kodzie jakoś nie było...

0

Może begin wstawić? Bo w kodzie jakoś nie było...

ja bym wstawil begin i end ;)

0

Brak begin, to przypadek. Razem z nim też nie działa.

0

A jaki błąd pokazuje kompilator?
I jak tworzysz ten komponent?

0

Błąd jest tego typu: undeclare dfsSystemListView1.

W swoich procedurach odwołuję się do komponentu, który dopiero zostanie utworzony po skompilowaniu. Dlatego ten błąd.

Pozdrawiam,
Piotr Murawski

0

Prawdopodobnie komponent dfsSystemListView1 jest zdefiniowany lokalnie w jakimś unicie lub procedurze, spróbuj zdefiniować go globalnie.

0

Komponent dfsSystemListView1 tworzony jest w zdarzeniu OnActivate głownej formy. Globalnie to znaczy, gdzie (jak) mam go utworzyć.

Piotr Murawski

0

Masz go zdefiniować, nie utworzyć, żeby był globalnie. Teraz jest pewnie zdefioniowany po var w procedurce obsługującej OnActivate głównej formy. Właściwie to czego w OnActivate a nie OnCreate? Moim zdaniem powinieneś zrobić tak : Zdefiniować w sekcji public klasy formy głównej, a tworzyć go w OnCreate.

0

Zapewne masz zadeklarowaną zmienną w ten sposób (zakładam, że ten komponent jest typu TdfsSystemListView):

procedure cos_tam();
var
  Zmienna: TdfsSystemListView;
begin

Po prostu zadeklaruj tę zmienną jako zmienną globalną, czyli nie w procedurze (jak wyżej), ale w całym unicie, a instrukcje jej tworzenia wpakuj do OnCreate formy.
Z drugiej strony zastanawiam się czy to dobry pomysł, ponieważ nie wiem czy program będzie tak samo po tym funkcjonował. Nie wiem do czego to ma służyć, a wydaje mi się dziwne tworzenie tego komponentu z każdą aktywacją formy. Może napisz jakieś szczegóły, do czego to ma być, co ma robić itp.

Możesz też zrobić tak:

procedure TForm1.KopiujClick(Sender: TObject);
var
  I:    Integer;
  FullName: String;
  FullPath: String;
  List: TdfsSystemListView;
begin

  List :=  FindComponent('Lista') as TdfsSystemListView;
  if List = nil then Exit;

  for I:= List.Items.Count - 1 downto 0 do
    begin
      FullName:=ExtractFileName(List.Items.Item[I].Caption);
      FullPath:=IsDir(dfsSystemTree.Directory) + FullName;
      if CheckListBox2.Items.IndexOf(FullPath) < 0 then
         CheckListBox2.Items.Add(FullPath);
    end;

end;

Przy tworzeniu tego komponentu musisz go nazwać (ustawić właściwość Name) 'Lista'. Nie wiem czy dobrze wstawiłem jedno 'end'.
Mam nadzieje, że sobie poradzisz :-D

0

Dzięki za podpowiedzi.

Szczegóły:
Korzystam z pakietu DFS (kiedyś dostępny pod http://www.delphifreestuff.com ), a wnim z dfsSystemListView i dfsSystemTreeView. Problem polega na tym, że te dwa komponenty spowalniają mi ładowanie aplikacji (ktoś zapyta dlaczego nie korzystajm z innych, jednak nie znalazłem nic podobnego). Pomyśłałem, że jak utworzę je dynamicznie to przyspieszę ten proces. No chyba, że jest inny sposób...

Pozdrawiam,
Piotr Murawski

P.S.
Mogę podesłać pakiet do testów.

0

Jeśli już chcesz go tworzyć dynamicznie to zrób tak jak napisał już berl. Stwórz komponent w OnCreate (a nie w OnActivate) i zadeklaruj zmienną globalną (nad słowem 'implementation' masz zmienne globalne, na górze unitu). Jeszcze inne rozwiązanie podałem w poprzednim poście. Pamiętaj o zwolnieniu pamięci przy zakończeniu programu!
A jeśli sobie nie poradzisz to wstaw Od razu ten komponent i po sprawie :-P

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