Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Reihenfolge Menüeinträge für TMainMenu (https://www.delphipraxis.net/148054-reihenfolge-menueeintraege-fuer-tmainmenu.html)

Hansa 21. Feb 2010 14:25


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:
for i := 0 to ComponentCount - 1 do begin
...
  menu.Items.Add (NewItem);
...
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.

mirage228 21. Feb 2010 14:26

Re: Reihenfolge Menüeinträge für TMainMenu
 
Also entweder direkt über Delphi-Referenz durchsuchenInsert oder mit Delphi-Referenz durchsuchenExchange (oder Delphi-Referenz durchsuchenMove :gruebel:)

Viele Grüße

Hansa 21. Feb 2010 14:32

Re: Reihenfolge Menüeinträge für TMainMenu
 
Das Add ist also quasi ein Zufallsgenerator ? :mrgreen: :gruebel:

mirage228 21. Feb 2010 14:36

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...

Hansa 21. Feb 2010 14:48

Re: Reihenfolge Menüeinträge für TMainMenu
 
Zitat:

Zitat von mirage228
..wird ja beim Entfernen und Hinzufügen von neuen Komponenten immer wieder geändert...

Da wird NICHTS immer wieder geändert. Lediglich im Formcreate werden die Dinger erzeugt. Aber bisher in willkürlicher Reihenfolge.

jfheins 21. Feb 2010 14:56

Re: Reihenfolge Menüeinträge für TMainMenu
 
Zitat:

Zitat von Hansa
Da wird NICHTS immer wieder geändert. Lediglich im Formcreate werden die Dinger erzeugt. Aber bisher in willkürlicher Reihenfolge.

Nö - in der Reihenfolge, wie die Komponenten im Components[] Array drinstehen. Das wird wahrscheinlich dieselbe sein, in der du die Komponenten aufs Formular getan hast ...

Christian Seehase 21. Feb 2010 15:02

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.

Hansa 21. Feb 2010 15:38

Re: Reihenfolge Menüeinträge für TMainMenu
 
Die paar Zeilen sind kein Problem. Bzw. sie zu posten.

Delphi-Quellcode:
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;
Vielleicht sieht ja einer was.

mirage228 21. Feb 2010 15:48

Re: Reihenfolge Menüeinträge für TMainMenu
 
Wo ist der Unterschied zwischen menu (letzte Zeile) und men (Parameter)? Vielleicht liegts ja daran...

Hansa 21. Feb 2010 15:51

Re: Reihenfolge Menüeinträge für TMainMenu
 
Ne, men= menu (Schreibfehler)

Hansa 21. Feb 2010 16:16

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:

Christian Seehase 21. Feb 2010 16:23

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

Uwe Raabe 21. Feb 2010 16:27

Re: Reihenfolge Menüeinträge für TMainMenu
 
Zitat:

Zitat von Hansa
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.

Die Einträge werden doch offenbar genau in der Reihenfolge eingefügt, in der du sie hinzufügst. Mehr kann man von TMainMenu wohl auch nicht erwarten. Was hier fehlt, ist wohl eher eine geeignete Definition der Reihenfolge. Das Hinzufügen selbst ist schon in Ordnung.

DeddyH 21. Feb 2010 16:30

Re: Reihenfolge Menüeinträge für TMainMenu
 
Zitat:

Zitat von Christian Seehase
Dann liegt's also nicht an TMainMenu, sondern es liegt ein Layer-8-Problem vor ;-)
(den wollte ich schon lange mal unterbringen :mrgreen:)

:mrgreen:
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]

Hansa 21. Feb 2010 16:36

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 ?

DeddyH 21. Feb 2010 16:48

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;

Hansa 21. Feb 2010 16:53

Re: Reihenfolge Menüeinträge für TMainMenu
 
Falls es jemand interessiert :

Delphi-Quellcode:
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;
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.

DeddyH 21. Feb 2010 16:55

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 ;)

Hansa 21. Feb 2010 17:05

Re: Reihenfolge Menüeinträge für TMainMenu
 
Moment. Das
Delphi-Quellcode:
inherited;
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.

DeddyH 21. Feb 2010 17:15

Re: Reihenfolge Menüeinträge für TMainMenu
 
Und wie hast Du das jetzt gelöst?
Zitat:

Delphi-Quellcode:
NewItem.OnClick := c.OnClick;

Das ginge ja dann nur noch über FindComponent o.ä., wenn ich nicht danebenliege.

Hansa 22. Feb 2010 16:43

Re: Reihenfolge Menüeinträge für TMainMenu
 
Wich ich das jetzt gemacht habe ? So :

Delphi-Quellcode:
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;
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.

P.S.: hatte auch mit TObjectList spekuliert. Dazu müsste man dann aber noch die Sortierroutinen selber bauen. So wars eben einfacher. :P

DeddyH 22. Feb 2010 16:49

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.

Hansa 23. Feb 2010 15:11

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.

DeddyH 23. Feb 2010 15:28

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