Delphi. Tworzenie TListBox po wciśnięciu klawisza.

0

Witam.
Jesteście moją ostatnią deską ratunku. Męczę się z tym 2 dni, jednak dalej nie mogę tego zrobić.
Mam komponent SynMemo i jest on umieszczony w zakładkach.
Otóż, chcę, aby po wciśnięciu klawisza np "<"
wyświetlało się okienko. Mam większość kodu, jednak brakuje mi początku ;c W ogóle nie wiem jak zacząć procedurę, która tworzy okienko po wciśnięciu klawisza.
To co wam się przyda w pomocy mi w rozwiązaniu mojego problemu:
(PageControl1.ActivePage.Controls[0] as TSynMemo) w tym ma być naciskany, czy może lepiej tam ma być naciskany klawisz "<"
po wciśnięciu tworzy:

 
var
lb := TListBox;
begin
lb =: TListBox.Create(Self);
lb.Parent := (PageControl1.ActivePage.Controls[0] as TSynMemo);
i tak dalej
no i na końcu oczywiście
lb.Show;
 

Proszę pomóżcie mi.
Z góry dziękuję.
Dodam, że udało mi się to zrobić przy jednym komponencie SynMemo,
jednak mi chodzi o to, aby działo się to na aktywnej zakładce

0

Czytam, czytam i dalej nie potrafię zrozumieć o co chodzi autorowi....

0

@Młody: pytającemu pewnie chodzi o efekt jak w IDE kompilatorów, tylko że on po wciśnięciu "<" chce mieć pewnie w ListBox listę podpowedzi polecen które może zawrzeć w tagach. Ja pytającemu porponuje jeżeli nie chce aplikacji MDI chociaż takowa byłą by tutaj wskazana z wieloma oknami, to możesz strony w PageControl tworzyć dynamicznie przez kod i na nich Memo o nazwie 'SynMemo' + IntToStr(IndeksAktualnejZakladki +1) . Poniżej jest kod, o który Tobie chodzi ListBoxy będą miały nazwy UczSiePodstaw + IntToStr(IndeksAktualnejZakladki +1) . Poza tym jakbyś spojrzał do Helpa to byś dawno wiedział, że nie istnieje metoda dla TListBoxów o nazwie Show. Zdecyduj się więc, bo z Twojego kodu wynika, że chcesz stworzyć dynamicznie TListView, a nie TForm. Poza tym przez dwa dni już dawno byś wygooglował co i jak, ale nic brak samodzielności ludzi na tym forum już poznałem. Temat przenoszę do Newbie, bo tam jest miejsce wątków, które dotyczą podstaw. Oczywiście metodę SynMemo1KeyPress najlepiej dynamicznie podczep sobie pod kontrolki tworząć je dynamicznie, bo wystarczy jedna wspólna dla wszystkich. Niszczenie później oraz obsługa TListBoxa również można robić poprzez zmienną LB do której podstawisz wyszukanie kontrolki funkcją Self.FindComponent. I takie wyszukiwanie przez Controls[0] nie jest najlepszym pomysłem, ponieważ może zwracać kontrolkę inną niż SynMemo, więc najbezpieczniej dla kontrolek innych niż GroupBox wyszukiwać przez Self czyli na ogół jakąś podchodną TForm. A najlepiej to zawsze po wyszikiwaniu sprawdzać czy wartość zmiennej dla obiektu jest <> nil. I jeszcze jedna uwaga na przyszłośc, poza zadawaniem pytań o podstawy w dziale do tego przeznaczonym, pamiętaj o tagowaniu wątku nazwą środowiska, jak również sensownymi tematami, nie myśl że jak dodasz głupie "Proszę pomóżcie" to wszyscy rzucą się i telepatycznie zanim wejdą na forum rozwiążą Twój problem. Temat ma krótko streścić zagadnenie wątku poruszone w jego treści, a nie czynić z Ciebie jakiegoś "żebraka".

//...
procedure TForm1.SynMemo1KeyPress(Sender : TObject; var Key : Char);
const
  SynMemo_Name = 'SynMemo';
  ListBox_Name = 'UczSiePodstaw';
var
  LB : TListBox;
  Idx : integer;
  SynMemo : TSynMemo;
begin
  if Key = '<' then
  begin
    Idx := PageControl1.ActivePageIndex + 1;
    LB := TListBox(Self.FindComponent(ListBox_Name + IntToStr(Idx)));
    if LB = nil then
    begin
      SynMemo := TSynMemo(Self.FindComponent(SynMemo_Name + IntToStr(Idx)));
      LB := TListBox.Create(Self);
      LB.Name := ListBox_Name + IntToStr(Idx);
      LB.Parent := SynMemo;
      LB.Items.Add(SynMemo.Name);
    end
    else
    begin
      ShowMessage('ListBox na tej karcie jest już utworzony!');
    end;
  end;
end;
//...
0

Dzięki, jednak pomogłeś częściowo, gdyż owszem działa to, ale tylko na jednym SymMemo. jednak przy kolejnych zakładkach wymięka, mimo wszystko dzięki za pomoc, ma ktoś jakieś inne pomysły ? :D

0

Co znaczy wymięka? Mój kod był przetestowany na kilku zakładkach i ułożonym na każdej z nich jednym SynMemo o nazwie SynMemo + IntToStr(IndeksAktualnejZakladkiPageControlCzyliLiczonyOdZera) + 1. Jeżeli podczepiłeś te zdarzenie, którego kod przytoczyłem do OnKeyPress dla wszystkich TSynMemo do jakich Ci to potrzebne to MUSI zadziałać.

0

Tak tylko u mnie zakładka z komponentem twory się sama po kliknięciu w przycisk, i ten kod działa tylko przy głównej zakładce, tej co jest już otwarta i od początku chodziło mi o to, jak zrobić, żeby działało na wszystkich

0
DiKey11 napisał(a):

od początku chodziło mi o to, jak zrobić, żeby działało na wszystkich

A w czym problem? Przecież przypisujesz w kodzie zdarzenie na przykład: TwojSynEditUtworzonyDynamicznieNazakladce.OnKeyPress := SynMemo1KeyPress; i tyle. Oczywiście nazwa SynMemo musi być odpowiednia albo musisz dostosować sobie kod jaki podałem, tak aby u Ciebie działał dla ewentualnie innej nazwy SynMemo albo nadawać mu taką nazwę w kodzie, jaką założyłem - przy tworzeniu go dynamicznie.

0

Wielkie dzięki za szybką pomoc

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