![]() |
Reihenfolge Menüeinträge für TMainMenu
Hi,
habe hier diverse Forms, bei denen muss eine unterschiedliche Anzahl an TMainMenu-Items erzeugt werden. Deshalb wird das erst zur Laufzeit gemacht :
Delphi-Quellcode:
So, das Menü ist da, aber die Einträge sind wie Kraut und Rüben durcheinander. Wie wird die Reihenfolge bestimmt ? Taborder ists offenbar nicht.
for i := 0 to ComponentCount - 1 do begin
... menu.Items.Add (NewItem); ... |
Re: Reihenfolge Menüeinträge für TMainMenu
|
Re: Reihenfolge Menüeinträge für TMainMenu
Das Add ist also quasi ein Zufallsgenerator ? :mrgreen: :gruebel:
|
Re: Reihenfolge Menüeinträge für TMainMenu
Ach sorry, hab Deine Frage nicht ganz richtig gelesen.
Dann würde ich eher die Components[] Eigenschaft Deines Controls verantwortlich zeichnen, diese wird ja beim Entfernen und Hinzufügen von neuen Komponenten immer wieder geändert... da könntest Du dann ja mal mit den Nachforschungen ansetzen... |
Re: Reihenfolge Menüeinträge für TMainMenu
Zitat:
|
Re: Reihenfolge Menüeinträge für TMainMenu
Zitat:
|
Re: Reihenfolge Menüeinträge für TMainMenu
Moin Hansa,
Du solltest mal ein bisschen mehr Code herausrücken. Bei dem Bisschen kann ich den Fehler nicht reproduzieren. |
Re: Reihenfolge Menüeinträge für TMainMenu
Die paar Zeilen sind kein Problem. Bzw. sie zu posten.
Delphi-Quellcode:
Vielleicht sieht ja einer was.
procedure TfrmMenue.FormCreate(Sender: TObject);
var i : Integer; c : TComponent; NewItem: TMenuItem; begin inherited; men := TMainMenu.Create(self); for i := 0 to ComponentCount - 1 do begin c := Components [i]; if c is TmyPanel then NeuerMenueEintrag (men,c as TmyPanel); end; end; procedure TfrmMenue.NeuerMenueEintrag (var men : TMainMenu;c : TmyPanel); var NewItem : TMenuItem; i : Integer; st : string; begin NewItem := TMenuItem.Create(men); NewItem.Caption := c.Caption; NewItem.Name := 'men' + copy (c.Name,4,length(c.Name)); ShowMessage(NewItem.Name+' '+IntToStr (c.TabOrder)); NewItem.OnClick := c.OnClick; menu.Items.Add (NewItem); end; |
Re: Reihenfolge Menüeinträge für TMainMenu
Wo ist der Unterschied zwischen menu (letzte Zeile) und men (Parameter)? Vielleicht liegts ja daran...
|
Re: Reihenfolge Menüeinträge für TMainMenu
Ne, men= menu (Schreibfehler)
|
Re: Reihenfolge Menüeinträge für TMainMenu
Es liegt tatsächlich ziemlich eindeutig an der Reihenfolge, in der die Controls auf die Form gelegt werden. Habe die DFM editiert und schon ist die Reihenfolge anders. TMainMenu ist sowieso schon komisch, aber so kann man es echt den Hasen geben. Allerdings nicht den Seehasen. :mrgreen:
Sieht so aus, als müsste ich das komplett anders machen. Und das bei zig Forms. :shock: |
Re: Reihenfolge Menüeinträge für TMainMenu
Dann liegt's also nicht an TMainMenu, sondern es liegt ein Layer-8-Problem vor ;-)
(den wollte ich schon lange mal unterbringen :mrgreen:) |
Re: Reihenfolge Menüeinträge für TMainMenu
Zitat:
|
Re: Reihenfolge Menüeinträge für TMainMenu
Zitat:
Wenn man anderweitig Einfluss auf die Reihenfolge nehmen möchte, ohne die *.dfm zu editieren, muss man wohl selbst Hand anlegen, z.B. indem man die Komponenten erst einmal in einer Liste ablegt, diese dann sortiert und anschließend abarbeitet. [edit] Fipptehler [/edit] |
Re: Reihenfolge Menüeinträge für TMainMenu
Eher Layer-10, also dem Chef vom Chefentwickler von Delphi. 8) Es müsste schon möglich sein, die Reihenfolge von irgendwas auf der Form zu sortieren und darauf zuzugreifen. Nun gut, egal. Dann gilts eben das selber hinzubiegen. Oder alle DFMs zu editieren. :gruebel:
@Deddy : Vorschlag wie am einfachsten ? |
Re: Reihenfolge Menüeinträge für TMainMenu
Wenn Du nach dem Namen sortieren willst, vielleicht so (nur heruntergetippt, nicht getestet):
Delphi-Quellcode:
procedure TfrmMenue.FormCreate(Sender: TObject);
var i : Integer; c : TComponent; NewItem: TMenuItem; CompNames: TStringlist; begin inherited; men := TMainMenu.Create(self); CompNames := TStringList.Create; CompNames.Sorted := true; try for i := 0 to ComponentCount - 1 do begin c := Components [i]; if c is TmyPanel then CompNames.AddObject(c.Name, c); end; for i := 0 to CompNames.Count - 1 do NeuerMenueEintrag (men,CompNames.Objects[i] as TmyPanel); finally CompNames.Free; end; end; |
Re: Reihenfolge Menüeinträge für TMainMenu
Falls es jemand interessiert :
Delphi-Quellcode:
Dank Objektablage haben das jetzt alle Forms und fertig. :zwinker: @Deddy : Objects sind da etwas zu viel des Guten. Zumindest bei mir ist die Caption zur Sortierung geeignet.
procedure TfrmMenu.FormCreate(Sender: TObject);
var i : Integer; c : TComponent; begin inherited; sl := TStringList.Create; for i := 0 to ComponentCount - 1 do begin c := Components [i]; if c is TMyPanel then sl.Add((c as TPanel).Caption); end; sl.Sort; end; |
Re: Reihenfolge Menüeinträge für TMainMenu
Ich habe die Objekte ja nur eingefügt, um den Aufruf von NeuerMenueEintrag drinlassen zu können ;)
|
Re: Reihenfolge Menüeinträge für TMainMenu
Moment. Das
Delphi-Quellcode:
wird unterschätzt ! D.h., die Forms sind abgeleitet. Ich habe jetzt lediglich dem Vorfahr die Stringliste beigebracht und das weiß jetzt jede betreffende Form auch. Der Vorfahr liest dann sämtliche in Frage kommende Captions aus und sortiert die. Alles andere ist unverändert. Auch die betreffenden procedures.
inherited;
|
Re: Reihenfolge Menüeinträge für TMainMenu
Und wie hast Du das jetzt gelöst?
Zitat:
|
Re: Reihenfolge Menüeinträge für TMainMenu
Wich ich das jetzt gemacht habe ? So :
Delphi-Quellcode:
Der Trick ist eigentlich nur, dass das Menü nach den Captions sortiert werden soll und auch der Name gebraucht wird. Und die hänge ich einfach hintereinander. Die Prozedur NeuerMenuEintrag und alles andere bleibt unverändert.
procedure TfrmMenue.FormCreate(Sender: TObject);
var i : Integer; c : TComponent; NewItem: TMenuItem; begin inherited; sl := TStringList.Create; men := TMainMenu.Create(self); for i := 0 to ComponentCount - 1 do begin c := Components [i]; if c is TMyPanel then sl.Add(lb ((c as TMyPanel).Caption,50)+(c as TMyPanel).Name); end; sl.Sort; for i := 0 to sl.Count - 1 do begin c := FindComponent (Copy (sl[i],51,Length (sl[i]))); NeuerMenueEintrag (men,c as TMyPanel); end; sl.Free; end; P.S.: hatte auch mit TObjectList spekuliert. Dazu müsste man dann aber noch die Sortierroutinen selber bauen. So wars eben einfacher. :P |
Re: Reihenfolge Menüeinträge für TMainMenu
Dann finde ich meine Lösung mit den Objects aber eleganter, da Du ja auf FindComponent zurückgreifen musst, wie ich bereits vermutet hatte.
|
Re: Reihenfolge Menüeinträge für TMainMenu
Was heisst schon eleganter ? Dafür ist mein Quelltext auf die Schnelle wohl eher verständlich. :stupid: Allerdings : er ist zu starr. D.h., sofern eine Caption länger als 50 Zeichen ist, dann krachts. Man könnte den Wert nun hochschrauben, aber so was war moch nie mein Ding. Und siehe an : da ich das, wie gesagt in alle Forms eingebaut habe, mind. eine Caption war tatsächlich länger. 8-) Konsequenz : lieber doch die AddObject Variante verwendet.
|
Re: Reihenfolge Menüeinträge für TMainMenu
Über die Verständlichkeit kann man sich jetzt streiten 8-) . Auf jeden Fall war Deine Variante (übertragen): "Nimm von allen Paar Socken den linken und sortiere diese (die rechten wirfst Du auf einen Haufen). Nach dem Sortieren suchst Du zu jedem linken Socken den rechten aus dem Haufen und steckst das Paar in die Waschmaschine." Dagegen meine: "Nimm alle Sockenpaare und sortiere nach den linken. Anschließend alle Paare in die Waschmaschine". :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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-2025 by Thomas Breitkreuz