Komponenten durch For abfragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
setblockmaster
Beiträge: 6
Registriert: Di 15. Dez 2020, 19:00

Komponenten durch For abfragen

Beitrag von setblockmaster »

Guten Tag,
In meinem Formular habe ich knapp 20 RadioButtons bzw. CheckBoxen. Durch einen Klick auf einen Knopf soll jede Komponente abgefragt werden, ob sie aktiviert ist und dann soll der Name (Caption) in ein Array gespeichert werden.
Das Array soll also die Länge annehmen, wie viele Buttons/Boxen aktiviert sind und die Namen halt nacheinander in ein Array abgespeichert werden.
Vielleicht werde ich es auch in eine Textdatei speichern.

Kann mir dabei jemand helfen?

Schon Mal danke für Antworten
Schönen Abend noch!

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Komponenten durch For abfragen

Beitrag von Maik81SE »

Es gibt da 2 Möglichkeiten.
Entweder alle im jeweiligen OnChange abfragen, oder was ich in diesem Fall mache.

Eine seppereate Procedure und diese in jedem OnChance aufrufen.

An der OnChange kommst du definitiv nicht vorbei.

Da ich gerade am Tab bin, kann ich gerade kein Bsp Setzen.

PCs und PI4 bleiben heute aus.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

setblockmaster
Beiträge: 6
Registriert: Di 15. Dez 2020, 19:00

Re: Komponenten durch For abfragen

Beitrag von setblockmaster »

Hallo,
danke für deine Antwort :)
Es ist also nicht möglich, bei dem Klick auf einen Button durch alle Zahlen zu iterieren und jeweils den Wert abzufragen?

Mfg

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Komponenten durch For abfragen

Beitrag von wennerer »

Hallo,
ich hoffe das ich dich richtig verstanden habe. Probier mal mein kleines Beispiel ob das so in die richtige Richtung geht.
Vielleicht hilft es dir ja etwas weiter.

Edit: Hab ich vergessen, wenn du die // weg machst dann gehts mit dem Change Event.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(125.9 KiB) 61-mal heruntergeladen

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Komponenten durch For abfragen

Beitrag von m.fuchs »

Wenn du nicht alle Checkboxen in einem separaten Array zwischenhalten möchtest und es dir wirklich um alle Checkboxen auf einem Form geht, dann sollte dich folgender Code zum Ziel führen:

Code: Alles auswählen

function TForm1.GetCaptionsOfCheckedCheckboxes: TStringArray;
var
  o: TComponent;
  CurrentCheckbox: TCheckBox;
begin
  Result := []; // ursprünglich "TStringArray.Create", dies wird aber in zukünftigen FPC-Versionen nicht mehr unterstützt
  for o in Self do begin
    if o is TCheckBox then begin
      CurrentCheckbox := o as TCheckBox;
      if CurrentCheckbox.Checked then begin
        SetLength(Result, Length(Result) + 1);
        Result[High(Result)] := CurrentCheckbox.Caption;
      end;
    end;
  end;
end;
setblockmaster hat geschrieben:
Di 15. Dez 2020, 20:13
danke für deine Antwort :)
Es ist also nicht möglich, bei dem Klick auf einen Button durch alle Zahlen zu iterieren und jeweils den Wert abzufragen?
Antworten von Maik81SE kannst du immer getrost ignorieren.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Komponenten durch For abfragen

Beitrag von wennerer »

@m.fuchs: Geniale Function!
Was ich aber nicht verstehe ist warum muss man nach

Code: Alles auswählen

TStringArray.Create;
kein free verwenden? Macht das TStringArray selber?

Viele Grüße
Bernd

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Komponenten durch For abfragen

Beitrag von Socke »

TStringArray ist ein ganz normaler dynamischer Array und wird damit durch die automatische Referenzzählung wieder freigegeben.
Die Notation Result := TStringArray.Create ist gleichbedeutend mit SetLength(Result, 0), erzeugt im Gegensatz dazu aber keine Warnmeldung durch den Compiler.

Das ist eine relativ neue Syntax.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Komponenten durch For abfragen

Beitrag von wennerer »

Vielen Dank für die Erklärung.
Viele Grüße
Bernd

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Komponenten durch For abfragen

Beitrag von PascalDragon »

Socke hat geschrieben:
Mi 16. Dez 2020, 20:11
TStringArray ist ein ganz normaler dynamischer Array und wird damit durch die automatische Referenzzählung wieder freigegeben.
Die Notation Result := TStringArray.Create ist gleichbedeutend mit SetLength(Result, 0), erzeugt im Gegensatz dazu aber keine Warnmeldung durch den Compiler.
Bitte beachte, dass die Nutzbarkeit von Create ohne Parameter bei dynamischen Arrays ein Bug ist und in zukünftigen Versionen von FPC behoben wird.
Socke hat geschrieben:
Mi 16. Dez 2020, 20:11
Das ist eine relativ neue Syntax.
Man könnte auch einfach eine Syntax nehmen, die schon immer für dynamische Arrays funktioniert hat: Result := Nil. Dies funktioniert auch bei unbenannten Arrays.
Ansonsten gibt es ab 3.2.0 hierfür auch Result := []. Dies funktioniert ebenso mit unbenannten Arrays.
FPC Compiler Entwickler

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Komponenten durch For abfragen

Beitrag von m.fuchs »

PascalDragon hat geschrieben:
Do 17. Dez 2020, 09:57
Bitte beachte, dass die Nutzbarkeit von Create ohne Parameter bei dynamischen Arrays ein Bug ist und in zukünftigen Versionen von FPC behoben wird.
Oha, gut zu wissen.
PascalDragon hat geschrieben:
Do 17. Dez 2020, 09:57
Man könnte auch einfach eine Syntax nehmen, die schon immer für dynamische Arrays funktioniert hat: Result := Nil. Dies funktioniert auch bei unbenannten Arrays.
Ansonsten gibt es ab 3.2.0 hierfür auch Result := []. Dies funktioniert ebenso mit unbenannten Arrays.
Nil empfinde ich etwas unlogisch aber die neue Syntax mit den leeren, eckigen Klammern find ich gut.

Danke für die Hinweise.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Komponenten durch For abfragen

Beitrag von m.fuchs »

PascalDragon hat geschrieben:
Do 17. Dez 2020, 09:57
Bitte beachte, dass die Nutzbarkeit von Create ohne Parameter bei dynamischen Arrays ein Bug ist und in zukünftigen Versionen von FPC behoben wird.
Warum wird das eigentlich als Bug gesehen und behoben? Hat es irgendwelche Nachteile wenn die Möglichkeit eines Create ohne Parameter existiert?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Komponenten durch For abfragen

Beitrag von PascalDragon »

m.fuchs hat geschrieben:
Di 22. Dez 2020, 16:55
PascalDragon hat geschrieben:
Do 17. Dez 2020, 09:57
Bitte beachte, dass die Nutzbarkeit von Create ohne Parameter bei dynamischen Arrays ein Bug ist und in zukünftigen Versionen von FPC behoben wird.
Warum wird das eigentlich als Bug gesehen und behoben? Hat es irgendwelche Nachteile wenn die Möglichkeit eines Create ohne Parameter existiert?
Das Create existiert einfach nur zur Delphi Kompatibilität. Allein auf Grund der Tatsache, dass es zwei andere, umfassendere Varianten gibt sehe ich keinen Grund für dieses Konstrukt mehr zuzulassen als für die Kompatibilität nötig.
FPC Compiler Entwickler

Antworten