Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Code optimieren?


pupu - So 06.08.06 15:09
Titel: Code optimieren?
Hi...ich hab eine ganz bescheidene Frage... und zwar hab ich ein TicTactoe programmiert :zustimm: :wink: zwar noch ziemlich schlecht aber is halt noch in der Aufbauphase :wink:

Nu hab ich aber ma wieder mein typisches Problem, und zwar, dass mein Code ma wieder viiiiiiiiel zu kompliziert ist und viel zu lang...(479 Zeilen is eigentlich viel zu viel für so ein Spiel denk ich)

Und nu meine Bitte...könnt ihr euch (wenn ihr ma Langeweile und genug Zeit habt) an meinen Code setzen und den dahingehend optimieren, dass ich weniger viele Zeilen hab? Damit möchte ich niemanden irgendeine Arbeit aufdrücken oder abdrücken, sondern einfach mal wissen, was ich an meinem Styl ändern kann... weil ich weiß dass ich vieles einfach viel zu oft wiederhole und so weiter...
Aber da ich keinene Schimmer hab wie ich meinen Code umschreiben kann, wende ich mich hoffnungsvoll an euch :wink:

Wer kein Bock darauf hat (was ich voll und ganz verstehen kann) könnte mir aber hier trotzdem vielleicht mal sagen, wass ICH denn ma verbessern kann, ohne dass derjenige sich selbst diese Mühe macht...aber da ich nich sooo viel Ahnung davon hab, wäre es besser wenn den jemand optimieren könnte und erklärt was er verändert hat und warum...das wär RICHTIG geil von euch wenn ihr das machen würdet...

An sich kann wer keine Lust auf das ganze hat ja jemand vllt trotzdem mal das Spiel anschauen und bewerten (obwohl die meiste Kritik wohl negativ ausfallen wird :lol: )..

Danke schonmal


Tilo - So 06.08.06 15:26

Hallo,
meine 2 Codeoptimierungen:
a) eine boolsche Variable reicht aus um festzustellen welcher Spieler dran ist.
b) Schmeiss die Tlabels und TFields raus Verwende stattdessen Tbutton.


ZUm Programm ansich:
Ganz nett.
Sinnvoll wäre aber noch einzubauen, das nach dem 9. Click nicht zu schreiben "Spieler sowieso ist dran".


JayEff - So 06.08.06 15:32

Als erstes mal stimmt die Exe, die du uns geliefert hast, nicht mit dem Code überein. Zweitens muss ich erst diese Zeile:
  ptictactoe in 'ptictactoe.pas' {Form1}; ändern in diese:

Delphi-Quelltext
1:
  tictactoe2 in 'tictactoe2.pas' {Form1};                    

Da du deine unit einfach so umbenannt hast.
Drittens funktioniert der ganze Code nicht. Beispielsweise klicke ich einmal irgentwo hin, und schon wird eine waagerechte linie angezeigt. Du setzt nämlich im Resetknopf keine einzige Variable zurück. Außerdem tauchen Spalte2 und 3 nie auf, weiterhin wird Spalte1.Visible nicht auf false gesetzt.
Alle Felder sind immer halb verdeckt. Ich sehe immer nur ein halbes O oder ein halbes X.
Und dann fällt mir ein Tipp zum verringern der Zeilen ein: Schreib die Abfragen, ob jemand gewonnen hat, in eine eigene Procedure und ruf sie nach jedem Klick auf. Und schreib für alle 9 Felder nur eine Procedure, das geht so:
Setze bei jedem Feld die Eigenschaft Tag auf die Feldzahl. Bei Feld1 also Tag:=1 bei Feld2 Tag:=2; etc. Dann schreibst du folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure TForm1.Feld1Click(Sender: TObject);
Begin
    (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel).Visible := true;
    If kreuz Then
    Begin
        (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel.Caption := 'X';
        kreuz := false;
    End
    Else
    Begin
        (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel.Caption := 'O';
        kreuz := true;
    End;
    CheckIfWeHaveAWinner; //Deine selbstgeschriebene Procedure zum auf Spielende prüfen
End;

Und nun gib allen Feldern diese Procedure (Objektmanager -> Ereignisse -> onClick in der DropDown liste Feld1Click auswählen). Damit sparst du dir alle anderen Proceduren Feld2Click - Feld9Click.
Wenn du es dir noch einfacher machen willst, lass einfach alle Images weg und nenn die Labels Feld1-9, dann sparst du dir viel: (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel).Visible := true; wird zu (Sender as TLabel).Visible := true;


pupu - So 06.08.06 15:48

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhh

*mist*escheißescheiße (sorry)

Hab die original Source gelöscht...hatte vorher einige dateien mit dem namen "tictactoe" und "tictactoe2" in dem ordner...
hab alle dateien mit "tictactoe" gelöscht...aber irgendwie hab ich das so *mist*e gespeichert, dass die source zu "tictactoe2" "tictactoe.pas" hieß...die ich nun leider gelköscht hab...die source zu "tictactoe" is denn "tictactoe2.pas" gewesen (aus welchem grund auch immer ich son mist gebaut hab)...ich versuch ma n "recoverytool zu installieren...vllt bekomm ich die datei ja noch ma wieder :cry: :cry: :cry: :cry:
systemwiederherstellung bringt da wohl nix oder?

es war auf jeden fall das letzte was ich gelöscht hatte...

also bitte vorerst diesen thread schließen oder so...weil das hat ja keinen sinn, weil euch die falsche source vorliegt :x :x :x

aber trotzdem nochma zu dir tilo...

1. bei meiner gelöschten source hab ich die variable kreuz vom typ boolean benutzt um zu erkennen, wer dran is...so wurde nach jedem zug von "O" die variable kreuz auf true gesetzt, sodass man erkennen kann ob kreuz dran war oder nich

2. das hab ich vom sinn her nich verstanden mit den TFields und Tbuttons und so :wink:

@jayEff jetzt weißt du warum das ganze nich klappt...in dem eigentlichen code benutze ich ja panels...ich hab ja nur die falsche .pas dabei


Chryzler - So 06.08.06 16:21

Ich hab ihn mal ein bisschen optimiert.


JayEff - Mo 07.08.06 01:44

Nicht schlecht! Ich glaub, das macht ein Recovery tool überflüssig, denn der Code funktioniert einwandfrei.
Und er ist schon sehr weit optimiert, es ist auf eine wesentliche Procedure gekürzt! Nun müsste man im Siegfall die Labels "unklickbar" machen. Vielleicht eine Boolean, die vor dem Klickereignis abgefragt wird.


Platon - Di 08.08.06 15:12

So, ich hab dann mal noch ein paar letzte Kleinigkeiten verbessert...auch mal ein paar Dokuzeilen eingefügt...nur um das schneller zu lesen...für den ein oder anderen...

1) X kann O nicht mehr vom Feld schupsen und umgekehrt
2) bei Gewonnen ist das Bedienen der Felder net mehr möglich
3) mal noch ein Beende-Button eingefügt

@Edit : Wer beim compilieren Probleme hat, der sollte mal unter uses Variants einfügen.


Platon - Di 08.08.06 19:04

Mmh...ich hatte mal noch etwas Langeweile...hab damit noch etwas rumgespielt.

Die Länge des Quellcodes kann man nur schwer verkleinern, (so dass er auch noch lesbar bleibt !).

1) Anzeige, wer gewonnen hat
2) Dokumentation erweitert
3) Felder etwas vergrößert


Delete - Mi 09.08.06 00:08

sorry, der code stimmt nicht. nach einer manuellen eingabe muss zumindest die andere seite dran sein, und nicht, wenn man nicht dran denkt und den eigenen zug macht, dass plötzlich ein "verkehrter spieler" auftaucht. bitte korrigieren. danke.


Platon - Mi 09.08.06 09:35

Ok, dann hab ich mal noch schnell eine Anzeige eingebaut, die dir sagt, welcher Spieler am Zug ist... :)


pupu - Mi 09.08.06 15:09

ok dazu hab ich n paar Fragen...

1. Was sind die "Shapes"???
2. kann mir jemand detailliert erklären was genau püassiert wenn man auf "Reset" klickt?
3. Was hat es mit der prozedur "LabelClick" auf sich? habt ihr die dazugeschrieben? oder kann man die unter Events irgendwo hinzufügen? könnt ihr mir das nochmal erklären, wie durch einen Klick auf IRGENDEIN label die gesamte Hauptprozedur aufgerufen wird?
das is immer mein problem, dass ich jede möäglichkeit haarklein in eine neue Prozedur pack und so der Code viel zu lang und unübersichtlich wird

-geändert-


Platon - Mi 09.08.06 16:58

Zu 1) Hilfe Delphi

"Die Komponente TShape dient dazu, in einem Formular eine geometrische Figur darzustellen.

Beschreibung

Mit Hilfe eines TShape-Objekts lassen sich einfache geometrische Figuren in ein Formular einfügen. TShape führt Eigenschaften ein, welche die Gestaltung des Umrisses sowie der Füllung beschreiben."

Besser kann ich es auch nicht formulieren. Dient nur zum Aussehen der Rechtecke ! Bei TTT ist das recht praktisch. Über diesen Shapes werden Label gelegt. Diese Labels besitzen eine OnClick Event, denen du eine Funktion zu weisen kannst. Hier die Funktion "LabelClick". (siehe Objektinspector -> Ereignisse)

Zu 3)
Man könnte natürlich zu jedem Label ein eingen OnClick - Funktion schreiben. Sicher müsste man hier nicht prüfen, wenn du das Feld 1 (links oben) drückst, ob unten 7 8 9 jemand gewonnen hat...usw.
Da aber die Labels im Großen und Ganzen das selbe machen, kann man hier nur eine Funktion schreiben. Diese eine Funktion ist zwar etwas länger, aber der gesamte code wird evtl. kürzer.
Dieser Funktion muss man natürlich das Feld übergeben...Nummer...ID....Tag, um dann Unterscheidungen zu machen...

Ich sag es mal so....du hast ein Stück Kuchen und es gibt 3 Personen die nur auf den Startschuß warten ihn zu essen. Du bist der jenige welcher den Personen dies sagen kann. Die "Funktion" : "Iss den Kuchen" ist im Endefekt die selbe...nur wer den Kuchen ißt...das bestimmst du, indem du sagst "Maier iss den Kuchen"...
Also ONClick Feld 1 oder Feld 2 oder Feld 3...was da passiert ist das selbe...es wird zum "X"...

Diese Entscheidung wird hier mit "FeldClick(TLabel(Sender));" gemacht, also mit dem übergebenen Parameter.

Zu 2)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Reset_btnClick(Sender: TObject);
    var
    i : Integer;
    l : TLabel;
  begin
    for i := 1 to 9 do
      begin
        l := TLabel(FindComponent('Label' + IntToStr(i)));
        l.Font.Color := clBlack;
        l.Caption := '';
      end;
    gewonnen := false;
    if Kreuz = true then
      begin Edit1.Text := 'X ist am Zug'end
    else
      begin Edit1.Text := 'O ist am Zug'end;
    Edit2.Text := '';
  end;


(Keinen Kommentar zu "in der if-Scheife und in der else-Schleife kann man aber begin und end weglassen"... Danke)

Tja was macht die Funktion :

In der For - Schleife werden alle 9 Felder zurückgesetzt. In der 1. Zeile werden alle Labels l zu gewiesen und dann werden z.B. mit Label1.Font.Color die Schriftfarbe wieder auf schwarz gesetzt (da ja evtl. rot geworden ist) und dann wird die Caption geleert, also X und O verschwinden.

Tja was gehört noch zu einer "Resetfunkion" :

Gewonnen wird auf false gesetzt und Edit2 (hier das Gewinneranzeigefeld) wird geleert. Kreuz sagt aus ob X oder O dran ist...ist Kreuz true dann wird als nächstest ein X gesetzt...also muss in der Edit1 - Anzeige "X ist am Zug" stehen.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Platon - Mi 09.08.06 17:09

Hoffe den Quellcode kann man noch lesen...wenn nicht dann einfach mal runterladen...etwas höher...
Hoffe ich könnte dir etwas helfen...bin nicht so tolle im erklären...aber wegen deinen Prog-Problem, da kann ich nur eins sagen "Übung macht den Meister" ! :)


pupu - Mi 09.08.06 19:58

alles klar danke sehr...

ich wusste gar nich, dass man das ganze so einfach übergeben kann... Hatte mich bei der Programmierung die ganze Zeit gefragt wie man die einzelnen Labels jeweils einfach übergeben kann...aber dass es sooo einfach geht hätt ich nich gedacht :)

Das is es immer bei mir. Ich weiß noch nicht wie ich Delphi am besten nutzen kann um optimalen Code zu bekommen...aber das kommt denk ich ma...spätestens nach den 2 Jahren 4-Wochenstunden Informatikuntericht als Vorbereitung auf meine mündlich Abiturprüfung in Informatik :lol:


Platon - Do 10.08.06 11:18

:)
Das ist ja auch das Problem, heute als Einsteiger wirst du erschlagen mit den ganzen Methoden und Eigenschaften der Tools die dir schon standardmäßig zur Verfügung stehen...

Hab damals mit TurboPascal in der Schule angefangen, das war noch etwas einfacher...ach ja...


JayEff - Do 10.08.06 14:35

user profile iconPlaton hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
{------------------------------------------------------------------------------}
Procedure TForm1.Reset_btnClick(Sender: TObject);
Var
    i: Integer;
    l: TLabel;
Begin
    For i := 1 To 9 Do
    Begin
        l := TLabel(FindComponent('Label' + IntToStr(i)));
        l.Font.Color := clBlack;
        l.Caption := '';
    End;
    gewonnen := false;
    If Kreuz = true Then
        Edit1.Text := 'X ist am Zug'
    Else
        Edit1.Text := 'O ist am Zug';
    Edit2.Text := '';
End;


Mit Delphitags kann mans sicher besser lesen, als ohne.
user profile iconPlaton hat folgendes geschrieben:
(Keinen Kommentar zu "in der if-Scheife und in der else-Schleife kann man aber begin und end weglassen"... Danke)

Yo.. Ich hab sie einfach weg gemacht. was soll das? :shock: Sind übrigens keine Schleifen sondern Abfragen. Wenn, dann wärens for- oder while- Schleifen.
Hab auch die Formatierung überarbeitet, bzw. mal den sourceFormatter drüberlaufen lassen ...


Platon - Mo 14.08.06 16:20

Dann Danke für die Aufklärung was Schleifen und Abfragen sind !

Jeder hat so seinen eigenen Programmierstil. Wem es nicht passt, der regt sich halt auf !? Was soll's !?


JayEff - Mo 14.08.06 16:22

keep cool, passt ja soweit :mrgreen: Ich glaub das Thema is erledigt, dann... oder? ^^


pupu - Di 15.08.06 12:53

bin grad dabei etwas ähnliches Programmiert mit vielen Labels, denen jeweils ein OnClick-Event zugefügt wird. Aber ich habs immer noch nich so ganz verstanden.

1.Also ist die Funktion "LabelClick(Sender: TObject);" selbst geschrieben? oder aus einem festgelegten Event heraus?

Woher erkennt das Programm dann dass es bei jedem Label diese Prozedur ausführen soll? an dem "Label" in dem Prozedurnamen?

2.FeldClick(TLabel(Sender)); : wird also das jeweilige Label im "TLabel" an die Prozedur "TForm1.FeldClick(var Feld: TLabel);" Was hat das "Sender" darin für eine Aufgabe?


Platon - Di 15.08.06 17:30

Die Funktion "LableClick" schreibst du selber !
Bei einer Funktion, die du später einem Event (z.B. OnClick) zu weisen willst, musst du der Funktion den Sender vom Typ TObject übergeben.

Wenn du nun selber den "Sender" auswerten willst, also die Funktion noch anderen OnClick - Events zuweisen willst, kannst du mit z.B. "TLabel(Sender)" -> Label3 oder "TButton(Sender)" -> Button4 den Button/Label bestimmen und auswerten.

Im Objektinspector kannst du dann die Funktion dem Event/den Events zuweisen.


Platon - Di 15.08.06 17:43

TForm1.LabelClick(Sender: TObject);

-> Funktion der Klasse TForm1
"Normalerweise" schreibst du die Funkion für das eine Event, da ist es meist unwichtig den Sender auszuwerten. Du setzt irgendwas oder irgenwas wird berechnet.

-> Da du aber die Funktion bei mehreren Labels - OnClick auslösen willst und es wichtig ist zu wisssen, welches Label gedrückt wurde, musst du den Sender auswerten.

-> Die Funktion "FeldClick(TLabel(Sender));" übergibt hier, da es sich bei dem Sender um ein Label handelt, das Label an die Funktion -> hier z.B. Label4

-> Die Procedure "TForm1.FeldClick(var Feld: TLabel)" wird nun mit "FeldClick(TLabel(Sender));" aufgerufen. In der Procedure "FeldClick" kannst du nun mit Feld.??? die Eigenschaften/Methoden von z.B. Label4 ansprechen...

-> Dies ist analog zu TButton etc. ("FeldClick(TButton(Sender));")


Platon - Di 15.08.06 17:47

Ich weiss am Anfang ist das alles etwas schweres Brot. :)


JayEff - Di 15.08.06 18:04

[ot]In diesem Forum wird der exzessive Usus der Edit-Taste gern gesehen ... Muss ich jetzt die Richtlinien rauskramen? ^^[/ot]


Platon - Mi 16.08.06 09:03

Sorry....beim nächsten mal !


pupu - Mi 16.08.06 13:44

alles klar dann hab ichs verstanden...aber ich hab noch eine frage :lol:

Wieso steht die Prozedur FeldClick(var Feld: TLabel); unter "public"? Weil ich aus anderen Prozeduren heraus auf diese zugreife? Was macht allgemein den Unterscheid zwischen den normalen Prozeduren die unter den Elementen (über "private"), unter "private" und unter "public" stehen?

edit: Ich habe hier ein Programm was ich grad machen möchte (verrat aber nich welches :P ) und da habe ich unter ganz vielen Panels (100) jeweils einen RadioButton (also auch 100). Wenn man auf ein Panel klickt, soll der jeweilige RadioButton Visible werden...

Kann man diese Aktion auch irgendwie abkürzen? oder komm ich so gar nich um viele Zeilen hinweg? Ungefähr do:

ich klicke auf das Panel pA2 wird folgende Prozedur ausgeführt (wie oben im Beispiel, deshalb schreib ich das ganze ja noch in diesen Thread rein :wink: )


Delphi-Quelltext
1:
2:
3:
4:
Procedure TForm1.PanelClick(Sender:TObject);
begin
FeldClick(TPanel(Sender));
end;

die Procedure FeldClick(var Feld: TPanel); sollte dann quasi den jeweiligen Radiobutton (im Beispiel: "A2") aufdecken, quasi "visible" machen.

Hab schon überlegt ob man das einfach mit 2 Parametern in der Prozedur FeldClick(); aber ich habe keinen Plan wie ich das bewerkstelligen soll...könnt ihr mir da helfen?


Chryzler - Mi 16.08.06 14:56

Ich würde es so machen:
Markiere alle Labels auf dem Formular, klick im Objektinspektor auf Ereignisse, und dort per Doppelklick auf OnClick. In dieser Prozedur hast du jetzt dein Sender und kannst machen was du willst. z. B:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.OnLabel1Click(Sender: TObject);
var
  n: Integer;
  l: TLabel;
begin
  l := TLabel(Sender);
  n := StrToInt(Copy(l.Name, 6, Length(l.Name) - 5));
  TRadioButton(FindComponent('RadioButton' + IntToStr(n))).Visible := true;
end;

Die Prozedur (ungetestet) funktioniert nur, wenn die Labels alle Label1, Label2, ... und die RadioButtons alle RadioButton1, RadioButton2 ... heißen.


pupu - Mi 16.08.06 15:07

hm also ich habe 2 "spielfelder" mit jeweils 100 Panels und 100 drunterliegenden RadioButtons. Beim linken Feld sind die Panels mit "p" + die Lage bezeichnet (z.b. A2 oder C6) wie beim Schachbrett + "_2" als Kennzeichnung für das 2. Feld

z.B.: der passende Radiobutton ders 2. Spielfeldes zum Panel pA2_2 ist A2_2 ...muss ma sehn wie ich das umstrick oder ob das überhaupt so möglich ist

Ich hab die so benannt, um innerhalb des Programmierens mir die Panel- und Radiobuttonnamen besser merken zu können.


Platon - Mi 16.08.06 15:07

Die Prozedur FeldClick(var Feld: TLabel); kannst du auch unter privat schieben...funktioniert genauso !

Wenn du Programme für dich selbst schreibst, dann kannst du ruhig alles unter public schieben...
Interessant wird das erst, wenn du Klassen selber schreibst ! Also auch mal andere Klassen davon ableiten willst. Oder du Bibliotheken schreiben musst für andere, die diese dann verwenden wollen/müssen.

privat deklarierte Funktionen und Methoden sind nur in dieser Klasse sichtbar und verwendbar.

protected deklarierte Funktionen und Methoden sind in dieser Klasse und in allen abgeleiteten Klassen sichtbar und verwendbar.

Bsp: b ist eine Klasse....color ist eine Funktion in protected...dann kannst du mit a.color draufzugreifen. Wenn color privat wäre...geht das nicht.
a : b;
a := b.create;
a.color....

public deklarierte Funktionen und Eigenschaften sind immer sichtbar und verwendbar .

Wenn nix der gleichen drüber steht, wie über privat in unserem Beispiel, dann ist das public.


pupu - Mi 16.08.06 17:39

Chryzler hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.OnLabel1Click(Sender: TObject);
var
  n: Integer;
  l: TLabel;
begin
  l := TLabel(Sender);
  n := StrToInt(Copy(l.Name, 6, Length(l.Name) - 5));
  TRadioButton(FindComponent('RadioButton' + IntToStr(n))).Visible := true;
end;


Also Beispiel:
mein label heißt label2. Das wird nun an l übergeben. und in n wird gespeichert: label2 (als zahl???)6(warum 6?)1(quasi 6-5) also kommt bei inttostr(n) raus: label161

das ergibt alles für mich vorne und hinten irgendwie kein sinn...

aber ich hab bestimmt was falsch verstanden oder?


Platon - Mi 16.08.06 18:41

In n ist nur die Zahl. Wenn l 'Label2', dann ist n gleich 2. Somit könntest du mit r (siehe unten) den 'RadioButton2' ansprechen.

Dann versuch das mal und debugge mal !


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  n: Integer;
  l: TLabel;
  r: TRadioButton;
begin
  l := TLabel(Sender);
  n := StrToInt(Copy(l.Name, 6, Length(l.Name) - 5));
  r := TRadioButton(FindComponent('RadioButton' + IntToStr(n)));
  r.Visible := true;
end;


pupu - Mi 16.08.06 19:21

habs ausprobiert in einem neuen programm...aber ich hab immer noch nich verstanden was genau im einzelnen die anweisung "n := StrToInt(Copy(l.Name, 6, Length(l.Name) - 5));" macht...könnt ihr mir das nochmal erklären?

so schritt für schritt? danke erstmal für die ganzen mühen die ihr euch macht :wink:

EDIT:könnte ich das auch irgendwie auf gemischte namen anwenden? z.b. heißen meine Panels auf dem betroffenen Feld ja alle pA_2 oder so ähnlich... is es nötig dass ich die umbenenn? oder muss ich das so abwandeln, dass ich für alle die mit pA anfangen diese prozedur mach? eigentlich schon, aber bevorich die fest einbau möchte ich erstma wissen was im einzelnen sie macht :wink:


Chryzler - Mi 16.08.06 19:50


Delphi-Quelltext
1:
l := TLabel(Sender)                    

Sender ist das angeklickte Label, jedoch als TObject, also wandeln wir das Sender erstmal in ein TLabel um.


Delphi-Quelltext
1:
n := StrToInt(Copy(l.Name, 6, Length(l.Name) - 5));                    

l.Name könnte zum Beispiel "Label37" sein. Mit dem Copy-Befehl bekomme ich den grünen Teil von "Label37": Ab dem 6. Zeichen bis zum Ende, das ist "37". Das ist jetzt noch ein String, der wird dann per StrToInt in einen Integer umgewandelt. n ist jetzt 37.


Delphi-Quelltext
1:
r := TRadioButton(FindComponent('RadioButton' + IntToStr(n)));                    

Die ganzen RadioButtons fangen mit "RadioButton" an, danach kommt die entsprechende Nummer. Per FindComponent suche ich mir den richtigen RadioButton. r ist dieser RadioButton.


Delphi-Quelltext
1:
r.Visible := true;                    

Dürfte eigentlich klar sein :wink:


Chryzler - Mi 16.08.06 20:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.OnLabel1Click(Sender: TObject);  
var  
  n: String;  
  l: TLabel;  
begin  
  l := TLabel(Sender);  
  n := Copy(l.Name, 22);  
  TRadioButton(FindComponent('RadioButton' + n)).Visible := true;  
end;

Müsste so eigentlich funktionieren. Du hast nur nicht gesagt, wie die RadioButtons bei dir heißen. Du musst das 'RadioButton' in das richtige Prefix ändern. Dann sollts gehen :D


pupu - Mi 16.08.06 21:14

boah geil klappt...besten dank...ich hoffe das war erstmal...