Die ganze Panel Klasse ansprechen

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

Wie kann ich dies denn in eine Schleife packen?
Es gibt da ein Trick. Du hast ja schon einiges gesehen jetzt. Du könntest deinen Komponenten ein Tag geben. Im OI gibst du den Tag einen Wert größer 0.
Nun hast du ja zwei Komponenten Gruppen. Ein TMenuitem und ein TPanel. Beide sind sich in gewisser weise Kompatibel zu einander.
Panel1.Tag:=0; MenuItem1.Tag:=0;
Wenn du das gemacht hast, kannst du es zuweisen.

Code: Alles auswählen

 
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
Das ist ganz einfach. + IntToStr(i);
Diese Funktion Wandelt Zahlen in einen String.

Es gebe da nach einen zweiten Weg. Wenn es nicht unbedingt ein Array sein muss.
(habe jetzt nicht alle Seiten durchgelesen...)
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 »

Das ist ganz einfach. + IntToStr(i);
ja das sagst du so :D aber nun weiß ich auch schon, dass das nicht geht ;)
Weil String wird ja nicht akzeptiert. Der Compiler sucht nach / braucht jeweils TPanel und TMenuItem

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 »

FPanelArray.Panel:='Panel'+IntToStr(i); sollte gehen, wenn Panel von Typ String ist.
Wenn es von Typ TComponent ist geht es Natürlich nicht.
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 »

Wenn es von Typ TComponent ist geht es Natürlich nicht.
Soweit war ich auch schon :lol:
Aber wie bekomme ich das i dann integriert - in einem TComponent?

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 »

Möglich wäre es analog http://www.lazarusforum.de/viewtopic.php?p=65646#p65646 ... ist aber nicht sauber, es sei denn man weiss wirklich, was man tut...

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 »

Ui also da hört der Durchblick auf...
Dann definier ich die halt einfach manuell. Man muss es ja nur einmal :)

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 »

Aber wie bekomme ich das i dann integriert - in einem TComponent?
Das Problem ist ein anders. TComponent ist kein String. Also nicht Kompatibel.
Obwohl es beides Klassen sind.

Eine Zuordnung ist nur durch ein Trick möglich. Wie eben die Tags nutzen. Muss es denn unbedingt ein Array sein? Das macht so eigentlich kein Sinn.
Die Komponenten werden ja schon gespeichert im Array Components.
MFG
Michael Springwald

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 »

Ich gehe jetzt einfach mal von diesem Code aus. Es soll immer nur ein Pannel Aktiv sein.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Enabed := True;
Panel1.Visible := True;
Panel2.Enabed := False;
Panel2.Visible := False;
{Der Rest wieder alles False}
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Panel1.Enabed := False;
Panel1.Visible := False;
Panel2.Enabed := True;
Panel2.Visible := True;
{Der Rest wieder alles False}
end;
Mein Vorschlag:

Code: Alles auswählen

 
// Das ist eine Methode von TFrom1, also da hinzufügen.
procedure TForm1.AktivierePanel(const aIndex:Integer);
var
  i:integer;
  Panel:TPanel;
begin
  for i:=0 to ComponentCount-1 do begin
    if Components[i] is TPanel then begin
     Panel:=Components[i] as TPanel;
      if i = aIndex then begin
       Panel.Visible:=True;
       Panel.Enabled:=True;
      end
      else begin
       Panel.Visible:=False;
       Panel.Enabled:=False;
      end;
    end;
  end;
end;
 
Kleine Rechtschreib Fehler können drin sein, ich habe den Code nicht geprüft. Aber so in etwa würde ich es machen.

Edit: Genau so gut könntest du jetzt die Pannels in ein Array übertragen... Dann ist die Reihenfolge aber nicht immer garantiert.
MFG
Michael Springwald

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

@Pluto: Die Panels/MenuItems zu indizieren ist auch gut, nur woher weiss er bei diesem Vorgehen, welches Index zu welchem Panel gehört (evtl. gibts auch MenuItems/Panels, die andere Funktionen haben)??? Das müsste er beim createn testen und dort in eine Liste schreiben...

Besser gleich alle MenuItems/Panels zur Laufzeit erstellen und deren Adressen gleich in eine Liste eintragen. Aber möglicherweise wäre für seine Aufgabe auch eine (evtl. aufpoppende) TRadioGroup besser geeignet (da gäbe es dann z.B. ein ItemIndex). Das stand aber bisher nicht zur Diskussion...

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 »

@Pluto: Die Panels/MenuItems zu indizieren ist auch gut, nur woher weiss er bei diesem Vorgehen, welches Index zu welchem Panel gehört (evtl. gibts auch MenuItems/Panels, die andere Funktionen haben)??? Das müsste er beim createn testen und dort in eine Liste schreiben...
Darum allen Komponenten einen Index geben. Alle Komponenten haben ein Tag. Diese ist von Typ Integer. Darüber ist es sehr einfach. Oder die Zahl Extrahieren aus den Namen. Schon hast du ein Index.
MFG
Michael Springwald

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Ja, ja, die vielen Wege nach Rom. Ich hätte auch noch einen, ohne den ganzen Kram mit dem Herausfinden der Indizes. Einfach Radiogroup (habe ich auf einer eigenen Form untergebracht) und ein PageControl auf der MainForm (@boneless: ähnlich TNotebook, wolltest Du ja wissen) und schon klappt die Zuweisung einfach über die Indexwerte (einfacher gehts fast nicht)...

Sämtliche Zuweisungen (Code) wären: In der MainForm:

Code: Alles auswählen

procedure TForm1.MI_WaehlePageClick(Sender: TObject);
begin
  Form2.RadioGroup1.ItemIndex:=PageControl1.ActivePageIndex;
  if Form2.ShowModal=mrOK then PageControl1.ActivePageIndex:=Form2.RadioGroup1.ItemIndex;
end; 
In der RadioGroupForm:

Code: Alles auswählen

procedure TForm2.RadioGroup1SelectionChanged(Sender: TObject);
begin
  ModalResult:=mrOK;
end; 
Das wars...

Leider tendiert der Lerneffekt dabei gegen 0 :(
Dateianhänge
Radiogroup mit PageControl.zip
(126.33 KiB) 81-mal heruntergeladen

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 »

Ich habe den Eindruck, er sollte sich noch etwas mit den Grundlagen befassen. Er kennt z.b. den Unterschied zwischen Klassen, String und Komponenten scheinbar nicht. Vielleicht hilft das ja hier weiter: http://www.delphi-treff.de/object-pascal/datentypen/
Da gibt es noch mehr.
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 »

Nabend Leute,

nochmal vielen Dank für euer großes Engagement! Aber ich muss ehrlich sein und sagen, dass sich das für mich erledigt hat. Ich nutze dieses eine Programm (Ich glaube das vorletzte von Michl), welches in meinen Augen sehr gut funktioniert und dies nutze ich jetzt auch.
pluto hat geschrieben:Er kennt z.b. den Unterschied zwischen Klassen, String und Komponenten scheinbar nicht.
Die Unterschiede zwischen Klassen, Strings usw. -meine ich- zu kennen, da mir ja (selbst) aufgefallen ist, dass ich einen Integer nicht zu einem Komponenten "addieren" kann.

Im Grunde kann ich eure Programme ja auch nachvollziehen und verstehe diese ja auch. Aber bei komplizierteren bzw. komprimiertere Schleifen bspw. hörts auch schon auf.

Danke, für eure nette Aufnahme im Forum und auch für diese großartige Hilfsbereitschaft ! Aber ich habe nun mein Programm aus euren zusammengebastelt und arbeite nun damit.
Auch wenn ich evtl. mir dadurch viel Schreibarbeit mache, weil es sicher noch einfacher geht, bin ich trotzdem -sagen wir mal- glücklich, dass es so funktioniert, wie ich es mir wünsche :)

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 »

Danke, für eure nette Aufnahme im Forum und auch für diese großartige Hilfsbereitschaft ! Aber ich habe nun mein Programm aus euren zusammengebastelt und arbeite nun damit.
Das ist die Hauptsache.... Das du etwas gelernt hast.
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 »

Ich habe da nochmal ne Frage... :?

Bei dem einen Programm (ich glaube von das Programm von Michl) hat er / hast du 6 Panels schon mal erstellt. Aber nun haben ich das Problem, dass ich weitere Panels nicht erfolgreich einfügen kann. Wenn ich auf MI_Panel7 klicke, kommt das "7.Panel" halt nicht :(

Bitte siehe Anhang
Dateianhänge
Paneltest.zip
(5.52 MiB) 85-mal heruntergeladen

Code: Alles auswählen

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

Antworten