Die ganze Panel Klasse ansprechen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Einfach im Event OnKlick von MenuItem 7 (MI_Panel) die Procedure "ShowPanel" verlinken.

PS: Da ich seh, was Du machst, schau Dir doch mal das letzte Projekt (mit der RadioGroup und TabControl) an, ich glaube wirklich, das ist wesentlich besser für Deinen Zweck geeignet. Habe zwar ShowTabs dort ausgestellt, können aber wieder einfach angestellt werden, dann ist auch ein Blättern zur Entwurfszeit wesenlich einfacher möglich, als die übereinander liegenden Panels zu bearbeiten (sparst Dir auch die ganze Zuweisungs- und Array-Geschichte)...nur meine Meinung... Ansonsten, siehts doch recht chick aus...

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 »

Michl hat geschrieben: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;



Meinste das? Das solll ich verwenden oder das Prog davor?

Code: Alles auswählen

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

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Jup das!

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 »

OK, ich werd mich da ma durch-fuchsen ;)

Danke

EDIT: Aber glaubste, das empfielt sich? Weil wenn Form 2 erscheint, macht er ja die schleife mit "Zeige Page" so und so. Da aber bei mir jede "Page" einen individuellen Namen bekommen soll, kann ich da ja keine Schleife machen.

Was ja evtl gehen würde, ist ein Array - aber da bin ich mal etwas vorsichtig :lol:

Code: Alles auswählen

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

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Schau Dir mal den Code an, Du brauchts kein Array oder irgenwelche Schleifen, Du hast einen Index! Lösche mal das FormCreate aus Form2!!!!! Trage statt dessen mal die Namen Deiner Panels oder sonstige Zeichketten in die Items von der RadioGroup ein. Try it! Versuchs! Macht Spass! :D

PS: Weitere Pages kannst Du mit einem Rechtsklick auf das PageControl hinzufügen.

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 »

Ich wusste es, kein Array! :D

Ok ich versuchs ;)

Code: Alles auswählen

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

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Die ganze Panel Klasse ansprechen

Beitrag von baba »

... was haltet Ihr denn davon es einfach so zu machen?

Code: Alles auswählen

 
procedure TForm1.AktivierePanel(pIndex : Integer);
var
  i:integer;
begin
  for i := 1 to 7 do begin     // 7, oder eben die Anzahl der Panel die es gibt.
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Enabled := False;
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Visible := False;
  end;
 
  (FindComponent('Panel' + IntToStr(pIndex)) as TPanel).Enabled := True;
  (FindComponent('Panel' + IntToStr(pIndex)) as TPanel).Visible := True;
end;
 


... wobei das Setzen von "Enabled" bei einem nicht sichtbaren Panel irgendwie keinen Sinn macht.

Code: Alles auswählen

 
procedure TForm1.AktivierePanel(pIndex : Integer);
var
  i:integer;
begin
  for i := 1 to 7 do begin     // 7, oder eben die Anzahl der Panel die es gibt.
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Visible := False;
  end;
  (FindComponent('Panel' + IntToStr(pIndex)) as TPanel).Visible := True;
end;
 


Fertig.

Gruß Baba.


Code: Alles auswählen

 
// Erweiterung - alle Panel automatisch links oben in die Ecke. (Übereinander)
 
procedure TForm1.AktivierePanel(pIndex : Integer);
var
  i:integer;
begin
  for i := 1 to 7 do begin     // 7, oder eben die Anzahl der Panel die es gibt.
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Visible := False;
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Left := 0;
    (FindComponent('Panel' + IntToStr(i)) as TPanel).Top := 0;
  end;
  (FindComponent('Panel' + IntToStr(pIndex)) as TPanel).Visible := True;
end;
 
 
 
Zuletzt geändert von baba am Mi 4. Dez 2013, 23:48, insgesamt 2-mal geändert.

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Jo, wobei das so ziemlich meiner ersten Antwort entpricht :roll: - ist aber MMn für das was er vorhat ein Umweg über Moskau wenn er von Berlin nach Rom will...

Code: Alles auswählen

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

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Die ganze Panel Klasse ansprechen

Beitrag von baba »

"Die ganze Panel Klasse ansprechen" will er. Ich sehe da keinen Umweg.

Baba.

pluto
Lazarusforum e. V.
Beiträge: 7178
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 »

Statt das "(FindComponent('Panel' + IntToStr(x)) as TPanel)." immer wieder zu machen, würde ich das nur einmal machen und in einer lokalen Variable von Typ TPanel abspeichern, nur so nebenbei....
MFG
Michael Springwald

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Ja dem Titel nach, wenn man aber die Posts liest - ach egal. Ich glaube es wäre eher ein Fall für Smart Questions...

Edit: huch Pluto war dazwischen :D

Code: Alles auswählen

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

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Die ganze Panel Klasse ansprechen

Beitrag von baba »

... sicher eine Anforderung, viele Lösungswege. (Wobei es mir nur um die Frage, nicht um sein Problem ging)

Wenn ich viele gleiche Komponenten, z.B. "Button1" - "Button10", ansprechen möchte, mache ich es so wie oben beschrieben.

Baba.

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von wp_xyz »

Das unschöne an "FindComponent('Panel' + IntToStr(x))" ist, dass man die Panels nicht umbenennen darf. Ich denke, es wäre eine der wichtigsten ersten Lektionen für einen Anfänger, dass man schleunigst sprechende Namen für die Komponenten verwenden sollte, also "PanelAusgabe" statt "Panel25" oder "PanelEingabe" statt "Panel18", zum Beispiel.

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

PageControl

Beitrag von Boneless »

Hallo Leute.

Ja ihr habt Recht; Mein Problem entspricht nicht 100%ig der Überschrift dieses Threads. Aber das Wissen kam ja auch erst hinterher ;)

@ Michl: Ich finde die Sache mit dem PageControl ziemlich super, da ich zwischen den Tabs übersichtlich wechseln kann, falls ich noch irgendetwas ändern muss. Das kann ich bei den Panels nicht. Da muss ich dann erstmal das richtige Panel raussuchen, die anderen irgendwo hinschieben und dann keine Lust mehr haben :D

@ All:
Bloß (!) Die Farbe vom PageControl kann ich nicht ändern, oder? Transparenz würde ja auch gehen. Funktioniert das irgendwie?
Dateianhänge
Prog mit PageControl.zip
(1.49 MiB) 97-mal heruntergeladen

Code: Alles auswählen

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

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

Re: Die ganze Panel Klasse ansprechen

Beitrag von Michl »

Boneless hat geschrieben:Bloß (!) Die Farbe vom PageControl kann ich nicht ändern, oder? Transparenz würde ja auch gehen. Funktioniert das irgendwie?
"Transparent" ist es doch, nimmt zumindest bei mir die Farbe der MainForm an.

[Edit] Ich habe mal mein Design geändert, da sehe ich, was Du meinst, ich glaube das ist ein Bug?!

Farbe individuell ändern geht nicht so einfach, siehe http://www.lazarusforum.de/viewtopic.php?f=18&t=2884&p=31343, dafür wäre die von Pluto vorgeschlagene Komponente TNotebook geeignet, die kann das.

Ich habe mal Dein Projekt so modifiziert (mit TNotebook), wie ich das in dem Beispiel gemacht hatte und etwas kommentiert - musst Du aber so nicht machen, ist nur ein Vorschlag.
Dateianhänge
Beispiel mit TNotebook.zip
(278.06 KiB) 84-mal heruntergeladen

Code: Alles auswählen

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

Antworten