wp_xyz hat geschrieben:ok - also Kommando zurück und ganz von vorne: Du hast ein Menu mit MenuItems, bei denen ein Klick ein bestimmtes Panel sichtbar macht? In solchen Fällen verwende ich die "Tag"-Eigenschaft, die jedem Control zugeordnet ist, hier kann man Zusatzinformation speichern, "Tag" wird ansonsten für nichts anderes verwendet. "Tag" ist vom Typ ein PtrInt, das ist ein Integer, der genauso viel Speicher belegt wie ein Pointer - das ist für 32-Bit Programme egal, wird aber bei 64-Bit wichtig, wo Pointer und Integer unterschiedliche Größen haben. Deine Panels, die im Object Inspektor als "Panel1", "Panel2" etc. bezeichnet werden, sind intern nichts anderes als Pointer. Du kannst damit jedem Tag eines MenuItems das zugehörige Panel zuweisen; leider geht das nicht im Object-Inspektor, und du musst das in der FormCreate-Methode erledigen:
procedure TForm1.FormCreate(Sender: TObject);
begin
MenuItem1.Tag := PtrInt(Panel1);
MenuItem2.Tag := PtrInt(Panel2);
// etc.
end;
Dabei bewirkt das PtrInt(...) eine Typ-Umwandlung, d.h. der Compiler wird angewiesen, den Pointer Panel1 als Integer zu interpretieren. Nach dieser längeren Schreibprozedur kennt jeder MenuItem das ihm zugewiesene Panel, und man kann in der OnClick-Routine das Panel aus- und einschalten:
procedure TForm1.MenuItemClick(Sender: TObject);
var
panel: TPanel;
mnuitem: TMenuItem;
begin
if (Sender is TMenuItem) then begin
mnuitem := TMenuItem(mnuItem);
panel := TPanel(mnuItem.Tag);
panel.Visible := mnuItem.Checked;
panel.Enabled := mnuItem.Checked;
end;
end;
Klaro?
Ich muss dich enttäuschen. Ich komm da noch nicht so ganz mit
Bei einem Klick auf MenuItem9 müsste Panel9 sichtbar werden. Es tut sich sich natürlich nichts, wenn Panel9 per Default schon sichtbar ist, setze es im Object Inspector mal auf Visisble = false. Au0erdem solltest du schon noch ein paar MenuItems entsprechend behandeln, um einen Effekt zu sehen...
Ansonsten poste das komplette Project (alle pas, lfm, lpi und lpr-Dateien in ein zip-Archiv packen), ich habe keine Lust, mir hier ein Formular mit 89 Panels und 90 MenuItems zusammenzuklicken.
Boneless hat geschrieben:Ich komm da noch nicht so ganz mit
Das hat er doch sehr gut beschrieben! Zum Verständnis noch folgende Anmerkung: Du brauchst nur eine Procedure MenuItemClick schreiben, diese dann mit allen MenuItems.OnClick verknüpfen (im Objektinspektor), evtl. ist das noch nicht so ganz klar?!
wp_xyz hat geschrieben:Bei einem Klick auf MenuItem9 müsste Panel9 sichtbar werden.
Ja ich weiß. Es ist sehr sehr sehr extrem verwirrend. Tut mir auch Leid.
Aber was ich eigentlich ja nur möchte, dass es funktioniert, dass ich alle Panels (von 1 bis 89) ansprechen kann. Das reicht mir schon! Dann kann ich glücklich schlafen gehen!
Bitte versteht das nicht falsch und seid mir auch nicht böse deswegen
Also ich brauch einfach nur n Code-Schnipsel, womit ich es schaffen kann, dass alle Panels "gleichzeitig" behandelt werden können - mit nur einem Klick!
procedure TForm1.MenuItem1Click(Sender: TObject);
var
panel: TPanel;
mnuitem: TMenuItem;
begin
if (Sender is TMenuItem) then begin
mnuitem := TMenuItem(Sender); //hier stand "mnuitem"
panel := TPanel(mnuItem.Tag);
if assigned(panel) then begin //und nachfolgendes habe ich anders gemacht
panel.Visible := not panel.Visible;
panel.Enabled := not panel.Enabled;
end;
end;
end;
Bitte versteht das nicht falsch und seid mir auch nicht böse deswegen
Hier ist niemand jemanden böse, nur der Ton ist manchmal etwas knisternd und nicht Knigge'rnd. Im Vergleich zu anderen deutschsprachigen Fach-Foren aber akzeptabel...
Aber ich glaube, wir reden etwas aneinander vorbei...
Gibt es nicht eine Möglichkeit? Einfach durch eine Schleife alle Panels beim Unterpunkt Enabled und Visible auf False zu setzen?
Einfach nur ne for-Schleife, die jedes Panel einmal durchgeht und die Werte dementsprechend verändert.
Weil diese for-Schleife, die ich meine und suche, würde mir schon sowas von weiterhelfen. Auch wenn es nicht programmiererfreundlich sein mag... diese for-Schleife... Dennoch würde mich das sehr weit bringen.
Trotzdem vielen vielen Dank für deinen Aufwand und deine Mühe!!
Hast Du das Projekt Dir angesehen? Nein! Ich denke, bevor Du Dich beschwerst, solltest Du das erstmal machen. Ich war einfach nur zu faul, die Autochecked-Eigenschaften einzustellen, daher hatte ich den Code umgestellt. Eine Procedure stellt alle Panels an/aus mit dem Klick auf das jeweilige Menu-Item!
Um später zu prüfen, ob Panel sichtbar/enabled ist, könntest Du, wie von wp_xyz vorgeschalgen, auf MenuItem.checked prüfen (müsstest, da halt die Checked-Eigenschaften einschalten), genauso aber auch auf Panel.. .visible/enabled. Dies in eine Schleife zu packen führt Dich aber wieder zum Array (oder zur Überprüfung aller Componenten der Form)...
Boneless hat geschrieben:Weil diese for-Schleife, die ich meine und suche, würde mir schon sowas von weiterhelfen. Auch wenn es nicht programmiererfreundlich sein mag... diese for-Schleife... Dennoch würde mich das sehr weit bringen.
Anbei noch die Schleife und MenuItem.Checked im Projekt.
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
memo1.Lines.Clear;
memo1.Lines.Add('Folgende Panels sind sichtbar:');
for i:=0 to ComponentCount-1 do
if Components[i] is TPanel then
if TPanel(Components[i]).Visible then
memo1.Lines.Add(TPanel(Components[i]).Name);
end;
Ich habe es mir zwar angesehen, aber muss dazu auch sagen: Es tut mir aufrichtig Leid, ich denke, ich habe mich nochmals falsch ausgedrückt.
So ist dieses Programmchen ja schon richtig. Es funktioniert ja auch alles. Bloß es soll ja nur ein Panel zur Zeit sichtbar sein.
Wenn MenuItem2 angeklickt wurde, ist nur Panel 2 zusehen. Alle anderen sind unabled und visibled sozusagen.
Wenn MenuItem8 angeklickt wurde, ist nur Panel 8 zusehen - kein anderes.
Ist zwar jetzt glaub ich für Dich gar nicht mehr nachzuvollziehen, aber ersetze mal die Procedure im letzten geposteten Projekt (Achtung Checked inside):
procedure TForm1.MenuItem1Click(Sender: TObject);
var
mnuitem: TMenuItem;
i: Integer;
begin
if (Sender is TMenuItem) then begin
mnuitem := TMenuItem(Sender);
if assigned(TPanel(mnuitem.Tag)) then
for i:=0 to ComponentCount-1 do
if (Components[i] is TMenuItem) and assigned(TPanel(Components[i].Tag)) then
if Components[i]=mnuitem then begin
TMenuItem(Components[i]).Checked:=True;
TPanel(TMenuItem(Components[i]).Tag).Visible:=True;
TPanel(TMenuItem(Components[i]).Tag).Enabled:=True;
end else begin
TMenuItem(Components[i]).Checked:=False;
TPanel(TMenuItem(Components[i]).Tag).Visible:=False;
TPanel(TMenuItem(Components[i]).Tag).Enabled:=False;
end;
end;
end;
oder nochmal anbei als Projekt.
Evtl. ist für Dich leichter zu verstehen, wenn Du wie im ersten geposteten Bsp von wp_xyz ein Array nimmst???