Autor |
Beitrag |
TriphunEM
Beiträge: 97
|
Verfasst: Di 15.03.05 17:14
Wie kann ich z.B. bei Mainmenü Menüeinträge sowie weitere Untermenüs in Untermenüs zur Laufzeit anlegen? Hab keine Ahnung wie es funktionieren soll????
Danke für die Hilfe!!!
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Di 15.03.05 17:24
Guck dir doch mal : Delphi-Quelltext 1:
| Mainmenu1.Items.Add(MenuItem); |
an
du musst erst ein MenuItem erstellen und das dann hinzufügen.
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
Zuletzt bearbeitet von PattyPur am Di 15.03.05 19:08, insgesamt 2-mal bearbeitet
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Di 15.03.05 17:52
also wie ich ein per laufzeit erstelle weiss ich selbst.
mir geht es nur darum das ich dort nicht nur item sondern auch subitems anlegen, aber wie kann ich in einem subitem wieder items oder neue subitems anlegen und immer so weiter???
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 15.03.05 17:57
Ohne es jetzt zu prüfen, vermute ich etwas in der Art:
Delphi-Quelltext 1:
| Mainmenu1.Items[1].Items.Add(MenuItem); |
Aber schlag mich nicht, wenn es nicht stimmt.
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Di 15.03.05 18:50
an sowas ähnliches hab ich auch schon gedacht, aber wie und wo der index bestiimt wird und wie ich den zuu ordne da hab ich keine ahnung!
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Di 15.03.05 19:06
Naja du weisst doch sicherlich >wo< Du die Menüs und Submenüs reinstellen willst.
- beziehungsweise hast du doch mit sicherherheit eine vorstellung nach welchem Muster du die Menüs erstellen willst - oder ?
naja und nach diesem Muster musst Du dann Deine Menüs durchsuchen und erweitern.
Gib uns doch mal ein Beispiel von dem was du eigentlich genau vorhast.
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Di 15.03.05 21:30
also ich lese daten aus einer db aus. diese daten sind in einer baumstruktur.
=> id,parent_id,url,description
ausgeben tue ich die daten mit einer rekursiven prozedure (erstmal in so in einer listbox):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure get_bookmarks(parent_id:integer;ebene:string); var TempQuery : TZReadOnlyQuery; begin TempQuery:=TZReadOnlyQuery.Create(nil); TempQuery.Connection:=form1.SqlConnection; TempQuery.SQL.Text:='SELECT * FROM bookmarks WHERE parent_id='+inttostr(parent_id); TempQuery.Open; while not TempQuery.Eof do begin form1.listbox1.Items.Add(ebene + TempQuery.FieldByName('url').AsString); get_bookmarks(TempQuery.FieldByName('id').AsInteger, ebene + '- '); TempQuery.Next; end; FreeAndNil(TempQuery); end; |
Das ergebnis sieht z.b. so aus :
Zitat: |
[dir] sub1
- [url] link1-1
- - [url] link1-1-1
- [url] link1-2
[dir] sub2
- [url] link2-1
- [dir] untersub2-1
- - [url] unterlink2-1-1
[dir] sub3
|
also -> ein baumdiagramm...
jetzt will ich diesen baum aber in eine toolbar2000 haben.
root also parent_id=0 sollen die ersten submenüs sein, und darin sollen dann alle weiter submenüs sowie die eigentlichen items aufgelistet werden.
ich habe bloß keine ahnung wie es bei toolbar2000 funzt...aber vorweg würde mir auch schon ein ansatz mit der Mainmenu-Kompo helfen...um es dann abzuleiten...
jemand eine idee, wie ich die prozedure umbauen muss????? Danke!
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Mi 16.03.05 19:57
Eine Idee:
Erstelle das Menü und befülle das Attribut TAG mit der jeweiligen ID - dann kannst du das Menü durchgehen um Die Stelle zu finden wo du die Unterpunkte reinhängen musst.
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Do 17.03.05 12:57
wie soll denn das überprüfen aussehen??? kann mir nix drunter vorstellen!?
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Do 17.03.05 13:29
Ich hab hier mal was Rekursives Gebastelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function AddToMenu(Menu:TmenuItem;Parent_ID, ID: integer; Caption: String):boolean; var i:integer; tempMenu:TMenuItem; added:boolean; begin added:=false; i:=0; while (i< menu.count) and (added = false) do begin if Menu.Items[i].Tag = Parent_ID then begin tempMenu:=TMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Items[i].Add(tempMenu); added:=true; end else begin added:= AddToMenu(menu.items[i],Parent_ID,id,caption); end; inc(i); end; result:=added; end; |
Das rufst du dann mit dem Wurzel-Element des Menüs wo es reinsoll auf:
Delphi-Quelltext 1:
| AddToMenu(MainMenu1.Items,0,1,'Text'); |
Dies sorgt dafür das im MainMenu1 an das Menuelement dessen TAG-Wert = 0 ist ein Menüelement angehangen wird mit dem TAG-Wert 1 und der Beschriftung 'Text'
Verständlich genug ?
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Do 17.03.05 14:52
Danke! Äm, du nutz nicht zufällig Toolbar2000? Scheint doch recht anders zu sein, als nur ein Mainmenu!
Ich kuck jetzt mal ob ich doch was ableiten kann!
Aber die Toolbar2000 macht mir schon Tage kopfzerbrechen!
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Do 17.03.05 16:29
das funzt super! wie müsste ich das machen das alle werte mit der parent_id 0 als hauptitem in dem mainmenu dargestellt werden???
Das könnte eventuell schon helfen, und dann müsste ich die toolbar2000 nicht nutzen, obwohl diese besser wäre!
?
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Do 17.03.05 17:16
Also Toolbar2000 nutz ich nicht tut mir leid - aber schau doch mal ob die Ähnlich funktioniert und ob du den Algorithmus darauf übertragen kannst.
Zu dem als Root einfügen:
Naja mach ne abfrage rein ob die Parent_ID = 0 ist und mach dann anstelle des funktionsaufrufes ein Mainmenu1.items.add()
oder ändere Die Funktion folgendermassen ab (ungetestet):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| function AddToMenu(Menu:TmenuItem;Parent_ID, ID: integer; Caption: String):boolean; var i:integer; tempMenu:TMenuItem; added:boolean; begin added:=false; if parent_id = 0 then begin tempMenu:=TMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Add(tempMenu); added:=true; end else begin i:=0; while (i< menu.count) and (added = false) do begin if Menu.Items[i].Tag = Parent_ID then begin tempMenu:=TMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Items[i].Add(tempMenu); added:=true; end else begin added:= AddToMenu(menu.items[i],Parent_ID,id,caption); end; inc(i); end; end; result:=added; end; |
EDIT:
Ok hab mir gerade Toolbar2000 mal angeschaut da sollte das ähnlich gehen - aber das bisschen denkarbeiot bekommst du auch alleine hin
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Do 17.03.05 17:51
danke funktioniert super! ein prob habe ich da noch. durch die laufzeiterstellung werden die items formatlos in das mainmenu eingebunden. ich habe eine erweiterte mainmenu-kompo wo ich z.b. xp und office style einstellen kann. das funzt bei manueller eintragung mit delphi super, aber die einträge durch laufzeit haben die formatierung da nicht???
muss man irgendwie tmenuitem mit mainmenu verknüpfen,oder wie funzt das???
danke!
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Do 17.03.05 18:02
was musst du denn da im objektinspektor für einstellen ?
guck doch ob du das im Quelltext auch machen kannst.
wie heisst denn diese Menü-Komponente ?
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Do 17.03.05 18:09
AdvMainmenu oder TZMainmenu!
Ich hab schon gekuckt und habe alles im Quellcode versucht einzustellen, aber kein Erfolg! Irgendwie muss man da noch was machen?
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Fr 18.03.05 13:24
noch ne frage. es funzt aber nur wenn schon mal ein eintrag in der mainmenu-kompo vorhanden ist!
ist sie leer geht garnix...
es liegt bestimmt an
Delphi-Quelltext 1:
| while (i< menu.count) and (added = false) do begin |
aber ich hab schon rum probiert und bekomm das ne hin...!???
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Fr 18.03.05 15:43
@PattyPur
Hi. Also ich habe jetzt raus wie man bei der Toolbar2000 weitere Submenus und Items in einem Submenu hinzufügt!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| var mainsub,untersub : TTBSubmenuItem; item : TTBItem;
begin
mainsub:=TTBSubmenuItem.Create(Self); mainsub.Caption:='Haupt-Submenue'; TBToolbar1.Items.Add(mainsub);
item:=TTBItem.Create(Self); item.Caption:='Ein Menupunkt'; item.Tag:=0; mainsub.Add(item); untersub:=TTBSubmenuItem.Create(Self); untersub.Caption:='Ordner'; mainsub.Add(untersub); |
Wie muss ich hier jetzt die obere Prozedure ändern?
wenn das prob gelöst ist, müsste ich alles haben! Wäre schön wenn du mir noch dabei helfen könntest, mir fehlt bei rekursiven verhalten der überblick!
Achja, und wenn es geht noch das obere Problem beheben, das mit dem leeren Menu. Wenn mämlich die Toolbar bzw. oben das Mainmenu leer ist schreibt er keine Werte rein!
Danke!
|
|
PattyPur
Beiträge: 80
Win98, WinXP
Delphi 7
|
Verfasst: Fr 18.03.05 17:28
Damit das mit der TB2k funzt muss die Funktion folgendermaßen abgeändert werden:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function TForm1.AddToMenu(Menu:TTBCustomItem;Parent_ID, ID: integer; Caption: String): boolean; var i:integer; tempMenu:TTBSubMenuItem; added:boolean; begin added:=false; if parent_id = 0 then begin tempMenu:=TTBSubMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Add(tempMenu); added:=true; end else begin i:=0; while (i< menu.count) and (added = false) do begin if Menu.Items[i].Tag = Parent_ID then begin tempMenu:=TTBSubMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Items[i].Add(tempMenu); added:=true; end else begin added:= AddToMenu(menu.items[i],Parent_ID,id,caption); end; inc(i); end;end; result:=added;
end; |
Achso und der Aufruf muss angepasst werden.
Delphi-Quelltext 1:
| AddToMenu(TBToolbar1.Items,0,1,'Caption'); |
Das sind vier zeilen Code die geändert werden mussten und das auch ohne das man Ahnung von Rekursion hat.
Das Problem mit dem Leeren Menü kann ich nicht rekonstruieren. Bei mir klappt es.
natürlich müssen die Elemente mit der Parent-ID = 0 zuerst eingeführt werden sonnst klappt es natürlich deswegen nicht weil die nachfolgenden Elemente ihr Parent-Element nicht finden
_________________ Das Leben ist zum Spielen da,
alles andere ist Unsinn
|
|
TriphunEM
Beiträge: 97
|
Verfasst: Fr 18.03.05 17:54
jo danke erstmal für all die hilfe! solche wie dich sollte es öfters geben!
also die prozedure nochmal abgeändert, nach submenu und items :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| function TForm1.AddToMenu(Menu:TTBCustomItem;Parent_ID, ID: integer; Caption: String; typ: String): boolean; var i:integer; tempItem:TTBItem; tempMenu:TTBSubMenuItem; added:boolean; begin added:=false; if parent_id = 0 then begin tempMenu:=TTBSubMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Add(tempMenu); added:=true; end else begin i:=0; while (i< menu.count) and (added = false) do begin if Menu.Items[i].Tag = Parent_ID then begin if typ='dir' then begin tempMenu:=TTBSubMenuItem.Create(Menu); tempmenu.Tag:=id; tempMenu.Caption:=caption; menu.Items[i].Add(tempMenu); end else begin tempitem:=TTBItem.Create(Menu); tempitem.Tag:=id; tempitem.Caption:=caption; menu.Items[i].Add(tempitem); end; added:=true; end else begin added:= AddToMenu(menu.items[i],Parent_ID,id,caption,typ); end; inc(i); end;end; result:=added; end; |
aufruf für submenu
Delphi-Quelltext 1:
| AddToMenu(TBToolbar1.Items,0,1,'Caption','dir'); |
für url/link
Delphi-Quelltext 1:
| AddToMenu(TBToolbar1.Items,0,1,'Caption','url'); |
|
|