![]() |
Problem mit Dynamischem Menü
Huhu,
ich habe ein Problem, das einfach klingt, mich aber vor Rätsel stellt. Ich erstelle PopUp Menü und einer der Einträge hat ein Untermenü, das ich dynamisch generiere, wenn es aufgerufen wird. Soweit kein Problem, das mache ich mit folgendem Code:
Delphi-Quellcode:
Geht sicher auch Eleganter aber es funktioniert.
fuunc.ASQLite3Query1.Active := false;
fuunc.ASQLite3Query1.SQL.Clear; fuunc.ASQLite3Query1.SQL.Add('SELECT * FROM kontinente;'); fuunc.ASQLite3Query1.Active := true; while not fuunc.ASQLite3Query1.Eof do begin SubItem := TMenuItem.Create(Self); SubItem.Caption := fuunc.ASQLite3Query1.FieldByName('name').AsString; BookArena1.Add(SubItem); fuunc.ASQLite3Query1.Next; end; Problem ist jetzt, das dieses SubMenü mehrfach aufgerufen werden kann und bei jedem Aufruf diese Punkte im Untermenü generiert. Also würde ich vorher gern erst alle (alten) Punkte löschen. Und da taucht mein Problem auf. Gelöscht bekomme ich jeh einen Eintrag, indem ich ihn genau anspreche. Durch ein "Count" weiß ich auch wieviele Einträge ich habe. Aber genau dieser Wert ändert sich ja, wenn ich einen Eintrag lösche. Ich kann ihn also nicht in einer einfachen for Schleife verwenden. Als Abhilfe habe ich folgendes versucht:
Delphi-Quellcode:
Ich dachte damit wird immer der letzte Menüeintrag gelöscht, bis keine mehr da sind.
while BookArena1.Count > 0 do begin
BookArena1.Delete(BookArena1.Count); end; Aber bei Ausführung des Codes, bekomme ich eine Zugriffsverletzung und Delphi stürzt komplett ab. Was mache ich falsch? Wie macht man es richtig? Gruß, Andreas |
AW: Problem mit Dynamischem Menü
Zitat:
Delphi-Quellcode:
for i := BookArena1.Count - 1 downto 0 do
BookArena1.Delete(i); |
AW: Problem mit Dynamischem Menü
Um alle zu löschen:
Delphi-Quellcode:
Den Rest kann man vergessen wegen der roten Box :-(
BookArena1.Clear;
// jetzt alles hinzufügen... Um geziehlt zu löschen ist Delete richtig aber Count gibt die Anzahl an, d.h. der höchste ansprechbare Eintrag in der Liste ist immer Count -1 Dein Code damit:
Delphi-Quellcode:
Oder auch per Schleife:
while BookArena1.Count > 0 do begin
BookArena1.Delete(BookArena1.Count-1); end;
Delphi-Quellcode:
Gruß, Chris
for i:= BookArena1.Count -1 downto 0 do
begin BookArena1.Delete(i); end; |
AW: Problem mit Dynamischem Menü
Danke, das "-1" wars. Manchmal habe ich echt einen Knoten im Hirn. Clear hat den Nachteil, das damit alle propertys vom Objekt gelöscht werden und ich dann nicht mehr darauf zugreifen kann.
Aber jetzt habe ich leider ein neues Problem. Nach dem löschen versuche ich die dynamische Generierung des Untermenüs. Hier noch mal der Code:
Delphi-Quellcode:
Aber da scheint irgendwo ne Endlosschleife zu sein. Der Curser wird zum Stundenglas mit dem Schriftzug "SQL" darunter und flackert ein wenig. Das wars aber. Da wird nichts fertig und der Cursor bleibt so.fuunc.ASQLite3Query1.Active := false; fuunc.ASQLite3Query1.SQL.Clear; fuunc.ASQLite3Query1.SQL.Add('SELECT * FROM kontinente;'); fuunc.ASQLite3Query1.Active := true; while not fuunc.ASQLite3Query1.Eof do begin SubItem := TMenuItem.Create(Self); SubItem.Caption := fuunc.ASQLite3Query1.FieldByName('name').AsString; BookArena1.Add(SubItem); fuunc.ASQLite3Query1.Next; end; Das ganze rufe ich übrigens in folgender procedure auf:
Delphi-Quellcode:
"BookArena1" ist ein Menüsegment in einem TPopUpMenu.
procedure Tpl.BookArena1Click(Sender: TObject);
Was übersehe ich jetzt? Gruß, Andreas |
AW: Problem mit Dynamischem Menü
Zitat:
Gruß, Chris |
AW: Problem mit Dynamischem Menü
Wozu denn die TMenuItems immer neu erstellen? Es reicht doch eine TObjectList<TMenuItem> mit den aktuellen Menüeinträgen, aus der ggf. überzählige Einträge gelöscht oder neue hinzugefügt werden um die neu gebrauchte Anzahl zu erreichen. Danach hat man dann die korrekte Anzahl und braucht nur die Überschriften neu zu setzen. ;-)
|
AW: Problem mit Dynamischem Menü
Zitat:
Gruß, Chris |
AW: Problem mit Dynamischem Menü
Danke für Eure Vorschläge, ich probier mal in der Richtung rum :).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz