Die ganze Panel Klasse ansprechen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Boneless
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

Beitrag von Boneless »

Danke, ebenso :)

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Boneless hat geschrieben:Ja super!

Das ist genau das, wonach ich suchte !
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öner :roll: :

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;  

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Die ganze Panel Klasse ansprechen

Beitrag von wp_xyz »

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

Boneless
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

Beitrag von Boneless »

Michl hat geschrieben:
Boneless hat geschrieben:Ja super!

Das ist genau das, wonach ich suchte !
Aber verstehen tust Du den Code nicht oder?
Hi, also Michl, im Gegensatz zu diesem Code von Test Panel Last verstehe ich den anderen davor viel besser :D
Also die einzelnen Elemente von den Codes kann ich ja nachvollziehen. Aber ich würde niemals genau so drauf kommen :) sagen wirs so :roll:

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
Aber ich habs hinbekommen und muss sagen: Ja, ich seh dort zu 90% gut durch und werde mein Prog darauf aufbauen :)

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

pluto
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

Beitrag von pluto »

Warum verwendet ihr kein TNoteBook? Macht genau da was ihr scheinbar wollt.
MFG
Michael Springwald

Boneless
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

Beitrag von Boneless »

pluto hat geschrieben:Warum ... kein TNotebook?
Wie funktioniert dies denn genau?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

pluto
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

Beitrag von pluto »

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.
MFG
Michael Springwald

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

wp_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.
Danke für die Info, habs probiert und funktioniert! War mir bisher nicht bekannt, wieder was dazu gelernt :)
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
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...

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

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;  

pluto
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

Beitrag von pluto »

versuche ich für mich sehr aussagekräftige Bezeichner/Variablen zu finden
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...

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

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Na dann Daumen hoch, das Glück war mir nicht vergönnt, hatte dann letztlich neu gebaut...

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; 
auf den ersten Blick (für mich) verständlich ist jedoch

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

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Hihi, nun habe ich doch noch eine rote Schleife drum gemacht...

Code: Alles auswählen

{$DEFINE MICHL} 
//oder
// {$DEFINE MICHL} 
je nachdem wie man´s mag...
Dateianhänge
TestPanel allerletzte Version.zip
(126.48 KiB) 86-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
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

Beitrag von Boneless »

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

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

pluto
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

Beitrag von pluto »

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.
MFG
Michael Springwald

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TNotebook

Beitrag von Michl »

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
Nö, kein Notebook ... nur Schleifchen, kleine rote Schleifchen hab ich mir da rein gemacht...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Boneless
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

Beitrag von Boneless »

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;
Wie kann ich dies denn in eine Schleife packen?
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;
 
Wie ich die Variable i in die Namen der jeweiligen Komponenten bekomme, ist mir ein Rätsel. Sonst habe ich den Rest ja verstanden ;)
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+}

Antworten