Autor Beitrag
TriphunEM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: Di 15.03.05 17:24 
Guck dir doch mal :
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 15.03.05 17:57 
Ohne es jetzt zu prüfen, vermute ich etwas in der Art:
ausblenden Delphi-Quelltext
1:
  Mainmenu1.Items[1].Items.Add(MenuItem);					


Aber schlag mich nicht, wenn es nicht stimmt.
TriphunEM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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):

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Do 17.03.05 12:57 
wie soll denn das überprüfen aussehen??? kann mir nix drunter vorstellen!?
PattyPur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: Do 17.03.05 13:29 
Ich hab hier mal was Rekursives Gebastelt:


ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: 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):

ausblenden volle Höhe 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:
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;
  //eine Konditionale abfrage auf Parent_id 
  // wenn 0 dann direkt hinzufügen ansonsten altes verfahren
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
  while (i< menu.count) and (added = false) do begin					


aber ich hab schon rum probiert und bekomm das ne hin...!???
TriphunEM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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!

ausblenden 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

// Hier wird der Hauptsub im Root erstellt, was dann später die Einträge, mit der Parent_id 0, sein sollen
mainsub:=TTBSubmenuItem.Create(Self);
mainsub.Caption:='Haupt-Submenue';
TBToolbar1.Items.Add(mainsub);

// Hier wird ein einzelner Item in dem Hauptsubmenu erstellt
item:=TTBItem.Create(Self);
item.Caption:='Ein Menupunkt';
item.Tag:=0;
mainsub.Add(item); // <- Hier wird es dem Hauptsubmenu zugeordnet mainsub.add...

// Hier wird dem Hauptsubmenu noch ein weiteres Submenu zugeordnet
untersub:=TTBSubmenuItem.Create(Self);
untersub.Caption:='Ordner';
mainsub.Add(untersub); // <- Hier wird es dem Hauptsubmenu zugeordnet mainsub.add...

// wenn man dem Untersub weitere Items bzw. Untersubs hinzufügen will muss man an dieser Stelle
// untersub.Add(...) benutzen , und so weiter und so weiter


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: Fr 18.03.05 17:28 
Damit das mit der TB2k funzt muss die Funktion folgendermaßen abgeändert werden:

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
// Parameter von TMenuItem auf TTBCustomItem ändern.
function TForm1.AddToMenu(Menu:TTBCustomItem;Parent_ID, ID: integer;
  Caption: String): boolean;
var i:integer;
// Tempmenu wird nun vom Typ TTBSubmenuItem
    tempMenu:TTBSubMenuItem;
    added:boolean;
begin
  added:=false;
    if parent_id = 0 then begin
//enttsprechend der Änderung auch andere Konstruktoren aufrufen
    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
// hier auch den Konstruktor ändern
      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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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 :

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
// Parameter von TMenuItem auf TTBCustomItem ändern.  
function TForm1.AddToMenu(Menu:TTBCustomItem;Parent_ID, ID: integer;  
  Caption: String; typ: String): boolean;
var i:integer;
// Tempmenu wird nun vom Typ TTBSubmenuItem
    tempItem:TTBItem;
    tempMenu:TTBSubMenuItem;
    added:boolean;
begin
  added:=false;
    if parent_id = 0 then begin
//enttsprechend der Änderung auch andere Konstruktoren aufrufen
    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
// hier auch den Konstruktor ändern
      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
ausblenden Delphi-Quelltext
1:
AddToMenu(TBToolbar1.Items,0,1,'Caption','dir');					

für url/link
ausblenden Delphi-Quelltext
1:
AddToMenu(TBToolbar1.Items,0,1,'Caption','url');