
Die ganze Panel Klasse ansprechen
-
- Beiträge: 52
- Registriert: So 1. Dez 2013, 14:15
- OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
- CPU-Target: 64Bit
- Wohnort: Ostsee
Re: Die ganze Panel Klasse ansprechen
Danke, ebenso 

Code: Alles auswählen
program Boneless;
{$mode Einsteiger}{H+}
Re: Die ganze Panel Klasse ansprechen
Aber verstehen tust Du den Code nicht oder? Ich glaube, dass ich selber das Problem hätte, den geposteten Code in einem halben Jahr zu verstehen (müsste diesen mir dann auch erst nochmal genau ansehen). Die Lösung mit einem Array finde ich da verständlicher. Habe das letzte Projekt nochmal entsprechend geändert. Ich finde, das liest sich schönerBoneless hat geschrieben:Ja super!
Das ist genau das, wonach ich suchte !

Code: Alles auswählen
type
TForm1 = class(TForm)
Button1: TButton;
MainMenu1: TMainMenu;
Memo1: TMemo;
MenuItem1: TMenuItem;
MI_Panel1: TMenuItem;
MI_Panel2: TMenuItem;
MI_Panel3: TMenuItem;
MI_Panel4: TMenuItem;
MI_Panel5: TMenuItem;
MI_Panel6: TMenuItem;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Panel6: TPanel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ShowPanel(Sender: TObject);
private
//man könnte in das Record auch noch einen "Namen" einfügen, dann könnte man
//zur Laufzeit sämtliche MenuItems und Panels erstellen
var
FPanelArray: Array[1..6] of Record
Panel: TPanel;
MenuItem: TMenuItem;
end;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.ShowPanel(Sender: TObject);
var
i: Integer;
begin
for i:=1 to 6 do
if Sender = FPanelArray[i].MenuItem then begin
FPanelArray[i].Panel.Enabled := True;
FPanelArray[i].Panel.Visible := True;
FPanelArray[i].MenuItem.Checked := True;
end else begin
FPanelArray[i].Panel.Enabled := False;
FPanelArray[i].Panel.Visible := False;
FPanelArray[i].MenuItem.Checked := False;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
//das könnte man auch per Schleife machen, ist so aber verständlicher:
FPanelArray[1].Panel:=Panel1;
FPanelArray[1].MenuItem:=MI_Panel1;
FPanelArray[2].Panel:=Panel2;
FPanelArray[2].MenuItem:=MI_Panel2;
FPanelArray[3].Panel:=Panel3;
FPanelArray[3].MenuItem:=MI_Panel3;
FPanelArray[4].Panel:=Panel4;
FPanelArray[4].MenuItem:=MI_Panel4;
FPanelArray[5].Panel:=Panel5;
FPanelArray[5].MenuItem:=MI_Panel5;
FPanelArray[6].Panel:=Panel6;
FPanelArray[6].MenuItem:=MI_Panel6;
for i:=1 to 6 do begin
FPanelArray[i].Panel.Visible:=False;
FPanelArray[i].Panel.Enabled:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('Folgendes Panel ist aktiv:');
for i:=1 to 6 do
if FPanelArray[i].Panel.Visible then
Memo1.Lines.Add('Panel Nr['+IntToStr(i)+']: '+FPanelArray[i].Panel.Name);
end;
end.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Die ganze Panel Klasse ansprechen
@Michl: So schlimm finde ich den Code jetzt auch wieder nicht. Meiner Meinung klar verständlich - sofern man die Idee mit dem Tag kapiert hat.
Man kann das gewünschte Verhalten (nur 1 MenuItem ge-"checked") übrigens auch erreichen, indem GroupIndex aller Items, die sozusagen eine RadioGroup bilden sollen, auf einen Wert <> 0 gesetzt wird.
Man kann das gewünschte Verhalten (nur 1 MenuItem ge-"checked") übrigens auch erreichen, indem GroupIndex aller Items, die sozusagen eine RadioGroup bilden sollen, auf einen Wert <> 0 gesetzt wird.
-
- Beiträge: 52
- Registriert: So 1. Dez 2013, 14:15
- OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
- CPU-Target: 64Bit
- Wohnort: Ostsee
Re: Die ganze Panel Klasse ansprechen
Hi, also Michl, im Gegensatz zu diesem Code von Test Panel Last verstehe ich den anderen davor viel besserMichl hat geschrieben:Aber verstehen tust Du den Code nicht oder?Boneless hat geschrieben:Ja super!
Das ist genau das, wonach ich suchte !

Also die einzelnen Elemente von den Codes kann ich ja nachvollziehen. Aber ich würde niemals genau so drauf kommen


Ach...und... Test Panel Last: Das Programm wird bei mir nicht ausgeführt, da der Compiler von Lazarus ein Fehler erkennt:
Aber ich habs hinbekommen und muss sagen: Ja, ich seh dort zu 90% gut durch und werde mein Prog darauf aufbauenLazarus hat geschrieben:unit1.pas(35,5) Error: VAR and TYPE are allowed only in generics

Code: Alles auswählen
program Boneless;
{$mode Einsteiger}{H+}
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Die ganze Panel Klasse ansprechen
Warum verwendet ihr kein TNoteBook? Macht genau da was ihr scheinbar wollt.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 52
- Registriert: So 1. Dez 2013, 14:15
- OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
- CPU-Target: 64Bit
- Wohnort: Ostsee
Re: Die ganze Panel Klasse ansprechen
Wie funktioniert dies denn genau?pluto hat geschrieben:Warum ... kein TNotebook?
Code: Alles auswählen
program Boneless;
{$mode Einsteiger}{H+}
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Die ganze Panel Klasse ansprechen
Das ist eine Komponente, in Lazarus. Stell sie dir so vor:
Du hast mehrere Pannels, die in einer Liste verwaltet werden. Umschalten kannst du jetzt im OI Beispielsweise. So das nur ein Panel Aktiv ist.
Ich meine du kannst auch noch Tabs ein und ausblenden.
Aber um das alles kümmert sich die Komponente selbst. Du fügst einfach nur noch "Seiten" hinzu.
Du hast mehrere Pannels, die in einer Liste verwaltet werden. Umschalten kannst du jetzt im OI Beispielsweise. So das nur ein Panel Aktiv ist.
Ich meine du kannst auch noch Tabs ein und ausblenden.
Aber um das alles kümmert sich die Komponente selbst. Du fügst einfach nur noch "Seiten" hinzu.
MFG
Michael Springwald
Michael Springwald
Re: Die ganze Panel Klasse ansprechen
Danke für die Info, habs probiert und funktioniert! War mir bisher nicht bekannt, wieder was dazu gelerntwp_xyz hat geschrieben:Man kann das gewünschte Verhalten (nur 1 MenuItem ge-"checked") übrigens auch erreichen, indem GroupIndex aller Items, die sozusagen eine RadioGroup bilden sollen, auf einen Wert <> 0 gesetzt wird.

Hatte ich verschoben, da es bei mir läuft (Feature von FPC 2.7.1 ?!) nicht weiter beachtet, da Du das aber so nicht machen willst, ists ja hinfällig...Boneless hat geschrieben:Ach...und... Test Panel Last: Das Programm wird bei mir nicht ausgeführt, da der Compiler von Lazarus ein Fehler erkennt:
Lazarus hat geschrieben:unit1.pas(35,5) Error: VAR and TYPE are allowed only in generics
PS: Ich finde die Nutzung von Bezeichnern, die nicht aussagekräftig sind, generell nicht so gut. Ich hatte früher gern schnell Code zusammengeklimpert (mache ich heute auch noch zum Testen von Dingen, siehe gestern), doch wenn es dann für wirkliche Projekte ist, versuche ich für mich sehr aussagekräftige Bezeichner/Variablen zu finden (daher hatte ich das nochmal mit dem Array angeregt, da dort dann wirklich nur die tatsächlich verlinkten MenuItems drinnen wären). Dass ich das eine Zeit lang nicht gemacht habe, ist mir dann später auf die Füße gefallen, als ich Änderungen an bestehenden Programmen machen musste

Wenn Du den Code verstehst (so wild ist er ja nun auch nicht) und evtl. notwendige Änderungen selber machen kannst, dann lass Dich nicht von mir ablenken

Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Die ganze Panel Klasse ansprechen
Das ist nicht immer einfach... Ich habe damit meine Probleme... z.b. nenne ich String Variablen gerne str1, str2, str3 oder Zähler Variablen: i1, i2, i3 oder ähnlich...versuche ich für mich sehr aussagekräftige Bezeichner/Variablen zu finden
Aber immerhin: Code den ich vor fünft Jahren geschrieben habe, kann ich heute noch Lesen... Da war ich ganz erstaunt. Vor einigen Tagen hatte ich das vergnügen...
MFG
Michael Springwald
Michael Springwald
Re: Die ganze Panel Klasse ansprechen
Na dann Daumen hoch, das Glück war mir nicht vergönnt, hatte dann letztlich neu gebaut...
Hineinlesen geht ja auch:
auf den ersten Blick (für mich) verständlich ist jedoch
Was beides prinzipiell das Gleiche macht, mit unterschiedlichen Ansätzen. Die Schleifen muss der Projektersteller dann immer mit sich rum tragen, auch später, wenn er auswerten will, welches Panel sichtbar ist (günstig wäre hier dann eine Klassenmethode).
Mir hat halt der erste Code nicht gefallen (vor allem wegen der Durchsicht aller Componenten). Habe auch noch versucht eine rote Schleife drum zu machen, da sah er immer noch nicht wirklich besser aus...
Hineinlesen geht ja auch:
Code: Alles auswählen
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;
Code: Alles auswählen
procedure TForm1.ShowPanel(Sender: TObject);
var
i: Integer;
begin
for i:=1 to 6 do
if Sender = FPanelArray[i].MenuItem then begin
FPanelArray[i].Panel.Enabled := True;
FPanelArray[i].Panel.Visible := True;
FPanelArray[i].MenuItem.Checked := True;
end else begin
FPanelArray[i].Panel.Enabled := False;
FPanelArray[i].Panel.Visible := False;
FPanelArray[i].MenuItem.Checked := False;
end;
end;
Mir hat halt der erste Code nicht gefallen (vor allem wegen der Durchsicht aller Componenten). Habe auch noch versucht eine rote Schleife drum zu machen, da sah er immer noch nicht wirklich besser aus...
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Die ganze Panel Klasse ansprechen
Hihi, nun habe ich doch noch eine rote Schleife drum gemacht...
je nachdem wie man´s mag...
Code: Alles auswählen
{$DEFINE MICHL}
//oder
// {$DEFINE MICHL}
- Dateianhänge
-
TestPanel allerletzte Version.zip
- (126.48 KiB) 87-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 52
- Registriert: So 1. Dez 2013, 14:15
- OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
- CPU-Target: 64Bit
- Wohnort: Ostsee
TNotebook
Ich möchte jetzt gern mal etwas über dieses TNotebook hören 
Ich hab im Web gesucht und nur englisches. Siehe Beispiel hier http://lazarus-ccr.sourceforge.net/docs ... ebook.html
Also wie kann ich das im Prog mit unterbringen und so weiter?
Würde mich mal interessieren
MfG Boneless
EDIT: Falls es im Anhang von Michl ist, dann muss ich da später mal schauen habe momentan nur das iPad zur verfügung

Ich hab im Web gesucht und nur englisches. Siehe Beispiel hier http://lazarus-ccr.sourceforge.net/docs ... ebook.html
Also wie kann ich das im Prog mit unterbringen und so weiter?
Würde mich mal interessieren
MfG Boneless
EDIT: Falls es im Anhang von Michl ist, dann muss ich da später mal schauen habe momentan nur das iPad zur verfügung
Code: Alles auswählen
program Boneless;
{$mode Einsteiger}{H+}
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Die ganze Panel Klasse ansprechen
Das ist eine Komponente. Die kann man ganz einfach Platzieren auf dein From.
Schau mal in deinen Komponenten rein. Da wirst du einige spannende Finden. Z.B. TPageControl. Oder eben TNoteBook.
Schau mal in deinen Komponenten rein. Da wirst du einige spannende Finden. Z.B. TPageControl. Oder eben TNoteBook.
MFG
Michael Springwald
Michael Springwald
Re: TNotebook
Nö, kein Notebook ... nur Schleifchen, kleine rote Schleifchen hab ich mir da rein gemacht...Boneless hat geschrieben:EDIT: Falls es im Anhang von Michl ist, dann muss ich da später mal schauen habe momentan nur das iPad zur verfügung
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 52
- Registriert: So 1. Dez 2013, 14:15
- OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
- CPU-Target: 64Bit
- Wohnort: Ostsee
Re: Die ganze Panel Klasse ansprechen
Wie kann ich dies denn in eine Schleife packen?Code: Alles auswählen
//das könnte man auch per Schleife machen, ist so aber verständlicher: FPanelArray[1].Panel:=Panel1; FPanelArray[1].MenuItem:=MI_Panel1; FPanelArray[2].Panel:=Panel2; FPanelArray[2].MenuItem:=MI_Panel2; FPanelArray[3].Panel:=Panel3; FPanelArray[3].MenuItem:=MI_Panel3; FPanelArray[4].Panel:=Panel4; FPanelArray[4].MenuItem:=MI_Panel4; FPanelArray[5].Panel:=Panel5; FPanelArray[5].MenuItem:=MI_Panel5; FPanelArray[6].Panel:=Panel6; FPanelArray[6].MenuItem:=MI_Panel6;
Etwa so?:
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i := 1 to 6 do
begin
FPanelArray[i].Panel:='Panel'+i; // Hier weiß ich nicht, wie ich das i in den Panel-Begriff bekomme
FPanelArray[i].MenuItem:='MI_Panel'+i; // Hier genau so
end;
end;

Weil ist mir ja auch klar: String ( 'Panel' ) plus Integer geht schlecht zu kombinieren bzw. addieren
Code: Alles auswählen
program Boneless;
{$mode Einsteiger}{H+}