kürzerer quelltext

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
sephor
Beiträge: 2
Registriert: Mi 10. Mär 2010, 17:19

kürzerer quelltext

Beitrag von sephor »

Ich bin ein blutiger Anfänger in Pascal (und jeglichen anderen Programmsprachen). Wir haben gerade Im Info Unterricht damit angefangen. Ich habe zuhause selber damit angefangen und will ne Anwendung schreiben. dabei kommt in einer function folgendes vor:

Code: Alles auswählen

TKCl1.enabled:=true;
    TKNr1.enabled:=true;
    TKCl2.enabled:=true;
    TKNr2.enabled:=true;
    TKCl3.enabled:=true;
    TKNr3.enabled:=true;
(TKCl1 und andere sind die identifier von TCombobox Objekten)

Da für alle sechs objekte das gleiche verändert, wird geht der text bestimmt auch in eine Zeile zusammen zu fassen. Nur wie?

Unser Info Lehrer hällt es nicht für wichtig uns so etwas zu erklären und ich habe keine ahnung was ich da goooglen soll. Wenn es bereits einen Thread über dieses Thema gibt dann bitte verweißt mich dorthin.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: kürzerer quelltext

Beitrag von monta »

Willkommen im Forum!

eine Zeile nicht ganz, du musst noch mit einer Schleife durchgehen.

Bei drei lohnt es sich wahrscheinlich nicht wirklich, aber falls du mehr haben solltest, geht es bspw. so:

Das einfachste ist eine hoch zählende Nummer im Namen, wie du ja schon hast. Dann kannst du folgendes nutzen:

Code: Alles auswählen

var i: integer;
//...
  for i := 1 to 3 do
    TComboBox(FindComponent('TKNr' + IntToStr(i))).Enabled := true;
siehe bspw. auch hier:
http://www.lazarusforum.de/viewtopic.ph ... ent#p29885" onclick="window.open(this.href);return false;
Johannes

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: kürzerer quelltext

Beitrag von Hitman »

Dass du "Muster" im Quelltext siehst und auch generell deine Wortwahl (immerhin kennst du Objekte und Identifier) sprechen dafür, dass die Programmierung im Blut liegt ;-)
Allerdings ist es ein Trugschluss, dass man sowas "einfach so" (=Sprachfeature) zusammenfassen kann. Man könnte sich diverse Hilfsmethoden bauen, die einem je nach Bedarf den Code etwas verschönern bzw. eleganter machen .... ist dann eine typische Kosten/Nutzen Frage.
Willst du zum Beispiel alle Child-Controls eines Containers disablen (z.B. alle Controls auf einem Panel), könntest du mit einer for-Schleife über die Child-Controls iterieren und entsprechend deren Enabled Eigenschaft setzen. Haben die gesuchten Komponenten systematische Namen (z.B. Label1 bis Label5) könnte man mit FindComponent arbeiten (wobei das schon wieder eher unschön ist). Auch könntest du dir eine Hilfsmethode bauen, die eine beliebige Anzahl (=open array) von TControls als Parameter erlaubt, dann könntest du sie beispielsweise so aufrufen: MeineFunktion([TKCl1, TKNr1, TKCl2, .........]);

Also: Möglichkeiten gibts viele, aber ob sich das für die paar Controls lohnt, sei dahingestellt. Ein paar Ansätze hast du damit jetzt trotzdem.

sephor
Beiträge: 2
Registriert: Mi 10. Mär 2010, 17:19

Re: kürzerer quelltext

Beitrag von sephor »

Danke für die Antworten werde das (zumindest in zukünftigen Projekten) noch brauchen.

@Hitman:
Dass du "Muster" im Quelltext siehst und auch generell deine Wortwahl (immerhin kennst du Objekte und Identifier) sprechen dafür, dass die Programmierung im Blut liegt
Danke!

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: kürzerer quelltext

Beitrag von pluto »

Ich könnte mir auch eine Extra Methode vorstellen:

Code: Alles auswählen

procedure TForm1.ActionEnabled(ACList: array of TAction; const aValue: Boolean );
var i:Integer;
begin
  for i:=0 to Length(ACList)-1 do  ACList[i].Enabled:=aValue;
end; // TForm1.ActionEnabled
Für dein Vorhaben musst du legendlich den Datentyp TAction ändern in TComponent. Da alle Komponenten davon abgeleitet sind. Daher kannst du diese Methode sogar für Buttons, Edits oder andere Komponenten einsetzten.
Aufgerufen wird sie so: ActionEnabled([Compo1, Compo2, Compo3],True);
Der Erste Parameter ist ein einfacher Array, der zweite gibt an ob alle Komponenten Aktiviert oder Deaktiviert werden soll.
MFG
Michael Springwald

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: kürzerer quelltext

Beitrag von lrlr »

> for i := 1 to 3 do
> TComboBox(FindComponent('TKNr' + IntToStr(i))).Enabled := true;

davon würd ich abraten, da dein code dann immer noch compilieren würde, auch wenn du die controls/componenten umbenennst..

zur laufzeit bekommst dann aber eine (böse) exception..

idee wäre noch die componenten/controls zur laufzeit zu erzeugen, und/oder sie in einem array/liste usw. zu speichern..

alle controls in ein panel zu legen (wenn das möglich ist) würd auch gehen, und dann einfach alle controls auf dem pannel enablen..

Antworten