[gelöst] TCheckbox platzieren und zugreifen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[gelöst] TCheckbox platzieren und zugreifen

Beitrag von NoCee »

Hallo zusammen,
ich versuche gerade auf einer Form mehrere Checkboxen visuell zu platzieren
und das .checked über einen Index zu setzen.
Quasi wie bei einem array.
mycheckbox.checked:=true;
Da die Checkboxen aber visuell auf die Form kommen, gibts ja keinen Index.
Es gibt z.B.
myCheckbox1
myCheckbox2
myCheckbox3
myCheckbox4.. wie die IDE das selber anlegt.
Wie kann ich auf eine spezielle Checkbox zugreifen ohne direkt "myCheckbox3" zu verwenden.
Geht das überhaupt halbwegs sinnvoll?
Alternative wäre ein array zu verwenden.
Hier aber die Frage wie ich die Checkboxen auf der Form verteile.
Oder macht man das so daß ich nichts sehe und zig mal probieren muß bis das optisch so paßt wie ich das will?

Schon mal danke im Vorraus für eure Hilfe
Gruß
NoCee
Zuletzt geändert von NoCee am Do 25. Feb 2021, 09:52, insgesamt 3-mal geändert.

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

Re: TCheckbox platzieren und zugreifen

Beitrag von wp_xyz »

Deklariere dir im Formular ein Array of TCheckbox und weise jedem Array-Element eine der Checkboxen zu. Nun kannst du eine Checkbox über den Index im Checkbox-Array ansprechen.

Code: Alles auswählen

type
  TForm1 = class(TForm)
    Checkbox1: TCheckbox;  // besser wäre es, die Checkboxen je nach Funktion umzubenennen
    Checkbox2: TCheckbox;
    Checkbox3: TCheckbox;
    ...
    procedure FormCreate(Sender: TObject);
  private
    FCheckboxes: Array of TCheckbox;
    ...
  end;
  
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(FCheckboxes, <anzahl der checkboxes>);  // Hier richtigen Wert verwenden
  FCheckBoxes[0] := Checkbox1;
  FCheckBoxes[1] := Checkbox2;
  FCheckBoxes[2] := Checkbox3;
   ...
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  cb: TCheckbox;
begin
  cb := FCheckboxes[StrToInt(Edit1.Text)];
  if cb <> nil then
    cb.Checked := not cb.Checked;
end;  
Wenn die Checkboxes wie in dem Beispiel schön säuberlich durchnummeriert sind, könntest du auch die Methode FindComponent nehmen, die als Parameter den Komponenten-Namen erwartet, der hier einfach aus "Checkbox" und einer Zahl konstruiert werden könnte (allerdings kannst du hier die Checkbox nicht umbenennen, so dass sie einen "sprechenden" Namen haben):

Code: Alles auswählen

function TForm1.FindCheckbox(CheckboxIndex: Integer): TCheckbox;
var
  checkboxName: String;
  C: TComponent;
begin
  checkboxName := 'CheckBox' + IntToStr(CheckboxIndex);
  C := FindComponent(checkboxName);
  if C is TCheckbox then
    Result := TCheckbox(C)
  else
    Result := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  cb: TCheckbox;
begin
  cb := FindCheckbox(StrToInt(Edit1.Text));
  if cb <> nil then
    cb.Checked := not cb.Checked;
end;  

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TCheckbox platzieren und zugreifen

Beitrag von Winni »

Hi!

Bau Dir eine procedure mit der Du alle Checkboxen an- oder ausschalten kanst.

Der Faulheit wegen ein Beispiel mit nur 2 Boxen:

Code: Alles auswählen

procedure TForm1.CheckTheBoxes(who: Integer; checkIt : Boolean);
begin
case who of
1: CheckBox1.Checked := checkit;
2: CheckBox2.Checked := checkit;
end; // case
end;

Statt who als parameter könnte man auch gleich die ganze Checkbox übergeben, aber das gibt wieder so viel Tipparbeit. Die Puristen werden dieses aber schöner finden.

Winni

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: TCheckbox platzieren und zugreifen

Beitrag von NoCee »

Das geht ja fast in Echtzeit.
Was da alles mit Lazarus geht, schon Wahnsinn.
Ich bin jedes mal aufs Neue von Lazarus begeistert.
Allerdings zeigt mir das jedes mal wie weit ich von der "Weisheit" weg bin. :)

Vielen Dank für eure Hilfe
Gruß
NoCee

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: [gelöst] TCheckbox platzieren und zugreifen

Beitrag von NoCee »

So, alles umgebaut und funktioniert prima. Vielen Dank dafür.
Einzig eine Baustelle bekomme ich nicht hin.

Code: Alles auswählen

procedure TForm1.FNetClientRBGXConnect(aSocket: TLSocket);
var
  Nr     : integer;
  myCompo: TLTCPComponent;
  i: integer;
begin
  myCompo := xxx as yyy;

   for i := 1 to 10 do begin
    if myCompo= FNetClientRBGx[i] then begin
      Nr:= i;
      break;
    end;
  end; 
  bla bla
Die Procedure ist ein event die gefeuert wird wenn LNet eine TCPIP Verbindung
aufgebaut hat. Ich habe die TLTCPComponets die auf der Form pappen
wie die anderen auch mit einem array verknüpft aber bei der Sender Abfrage
hörts bei mir jetzt auf. Das geht doch sicher auch irgendwie, oder?

Danke schon mal im Vorraus
Gruß
NoCee

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TCheckbox platzieren und zugreifen

Beitrag von fliegermichl »

Ich verstehe nicht. Was genau ist Deine Frage?

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: TCheckbox platzieren und zugreifen

Beitrag von NoCee »

bei einem TButton hab ich "Sender" und "as TButton"
bei meiner Component hab ich TLTCPComponent
aber als Sender steht da halt aSocket und ein TTLSocket
was muß da stehen myCompo := xxx as yyy;
oder geht das so nicht?
Ich hab da mehrere TLTCPComponent
TLTCPComponent1
TLTCPComponent2
TLTCPComponent3
TLTCPComponent4
und alle haben den gleichen event procedure TForm1.FNetClientRBGXConnect(aSocket: TLSocket)
und ich muß herrausfinden welcher FNetClientRBGx aus dem array das gefeuert hat.

Gruß
NoCee

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TCheckbox platzieren und zugreifen

Beitrag von fliegermichl »

Hmm,

der Entwickler von LNet hat wohl nicht vorgesehen, daß es mehrere TLTCPComponent Instanzen in einem Formular gibt und deshalb den Parameter Sender weggelassen.
Am einfachsten wäre es, für jede deiner Komponenten eine eigene OnConnect Methode zu schreiben, die dann eine gemeinsame aufruft.

Code: Alles auswählen

procedure TForm1.ComponentConnected(Sender: TObject; aSocket : TlSocket);
begin
 ...
end;

procedure TForm1.Component1Connect(aSocket : TlSocket);
begin
 ComponentConnected(Component1, aSocket);
end;

procedure TForm1.Component2Connected(aSocket : TlSocket);
begin
 ComponentConnected(Component2, aSocket);
end;
oder du leitest eine eigene Klasse von TLTCPComponent ab, die den Sender ebenfalls handhabt.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: TCheckbox platzieren und zugreifen

Beitrag von Sieben »

Ich kenne die Komponenten nicht, aber TLSocket hat ein property Creator: TLComponent, über das man evt auf die gesuchte Instanz zurückgreifen kann.

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: TCheckbox platzieren und zugreifen

Beitrag von NoCee »

Ich habs jetzt so gelöst, in dem ich die sendende IP-Adresse mit meiner connecteten vergleiche.
den Sender erhalte ich da über aSocket.

Die Prozeduren funktionieren aber über das Componentenarray wie oben beschrieben einwandfrei.
Das hat mir viel Aufwand erspart.

Vielen Dank noch mal für die Tipps
Ich wünsche einen schönen, sonnigen Tag
NoCee

Antworten