Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kann man diesen Quelltextausschnitt verkürzen? (https://www.delphipraxis.net/1406-kann-man-diesen-quelltextausschnitt-verkuerzen.html)

Helmut 22. Nov 2002 21:58


Kann man diesen Quelltextausschnitt verkürzen?
 
Hi,

die einzige Möglichkeit die mir dazu einfällt ist findcomponent - das hat aber irgendwie nicht funktioniert :oops:
Vielleicht fällt ja einem von euch was dazu ein, ich will den quelltext einfach kürzer machen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
zahl1:=random(6);
if zahl1=0 then wuerfel1.Picture.LoadFromFile('1.bmp');
if zahl1=1 then wuerfel1.Picture.LoadFromFile('2.bmp');
if zahl1=2 then wuerfel1.Picture.LoadFromFile('3.bmp');
if zahl1=3 then wuerfel1.Picture.LoadFromFile('4.bmp');
if zahl1=4 then wuerfel1.Picture.LoadFromFile('5.bmp');
if zahl1=5 then wuerfel1.Picture.LoadFromFile('6.bmp');

zahl2:=random(6);
if zahl2=0 then wuerfel2.Picture.LoadFromFile('1.bmp');
if zahl2=1 then wuerfel2.Picture.LoadFromFile('2.bmp');
if zahl2=2 then wuerfel2.Picture.LoadFromFile('3.bmp');
if zahl2=3 then wuerfel2.Picture.LoadFromFile('4.bmp');
if zahl2=4 then wuerfel2.Picture.LoadFromFile('5.bmp');
if zahl2=5 then wuerfel2.Picture.LoadFromFile('6.bmp');

zahl3:=random(6);
if zahl3=0 then wuerfel3.Picture.LoadFromFile('1.bmp');
if zahl3=1 then wuerfel3.Picture.LoadFromFile('2.bmp');
if zahl3=2 then wuerfel3.Picture.LoadFromFile('3.bmp');
if zahl3=3 then wuerfel3.Picture.LoadFromFile('4.bmp');
if zahl3=4 then wuerfel3.Picture.LoadFromFile('5.bmp');
if zahl3=5 then wuerfel3.Picture.LoadFromFile('6.bmp');

zahl4:=random(6);
if zahl4=0 then wuerfel4.Picture.LoadFromFile('1.bmp');
if zahl4=1 then wuerfel4.Picture.LoadFromFile('2.bmp');
if zahl4=2 then wuerfel4.Picture.LoadFromFile('3.bmp');
if zahl4=3 then wuerfel4.Picture.LoadFromFile('4.bmp');
if zahl4=4 then wuerfel4.Picture.LoadFromFile('5.bmp');
if zahl4=5 then wuerfel4.Picture.LoadFromFile('6.bmp');

zahl5:=random(6);
if zahl5=0 then wuerfel5.Picture.LoadFromFile('1.bmp');
if zahl5=1 then wuerfel5.Picture.LoadFromFile('2.bmp');
if zahl5=2 then wuerfel5.Picture.LoadFromFile('3.bmp');
if zahl5=3 then wuerfel5.Picture.LoadFromFile('4.bmp');
if zahl5=4 then wuerfel5.Picture.LoadFromFile('5.bmp');
if zahl5=5 then wuerfel5.Picture.LoadFromFile('6.bmp');

zahl6:=random(6);
if zahl6=0 then wuerfel6.Picture.LoadFromFile('1.bmp');
if zahl6=1 then wuerfel6.Picture.LoadFromFile('2.bmp');
if zahl6=2 then wuerfel6.Picture.LoadFromFile('3.bmp');
if zahl6=3 then wuerfel6.Picture.LoadFromFile('4.bmp');
if zahl6=4 then wuerfel6.Picture.LoadFromFile('5.bmp');
if zahl6=5 then wuerfel6.Picture.LoadFromFile('6.bmp');

end;
Ums eifacher zu machen könnte ich die bilder auch in 0.bmp bis 5.bmp umbenennen...
Ich wäre froh wenn mir da jemand bei helfen könnte

mfg
Helmut

Daniel 22. Nov 2002 22:17

Hallo,

wenn Du bereit wärest, die Zahlen in einem Array abzuspeichern, könntest Du den Code durch Verwendung einer Schleife noch weiter komprimieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var index : Integer;
begin
  Randomize;
  For index:= 1 To 6 Do
  Begin
    zahl[Index]:= Random(6);
    TImage(FindComponent('Wuerfel'+IntToStr(Index))).Picture.LoadFromFile(IntToStr(zahl[Index]+1)+'.bmp');
  End;
end;
In diesem Beispiel bin ich jetzt davon ausgegangen, dass Deine Komponenten "Wuerfel" vom Typ TImage sind - solltest Du eine andere Klasse verwandt haben, so musst Du die Typ-Umwandlung ("dat Dingens vor dem 'FindComponent'") entsprechend anpassen.

Helmut 22. Nov 2002 23:26

wow! Ich hätte ja mit allem gerechnet, aber das es so kurz geht hätte ich nicht gedacht *g*! :D
Das mit dem array ist echt ne gute idee gewesen! Ich meide irgendwie immer arrays weil man schnell nen fehler einbaut und den nichtsoschnell findet (bei sonem programmierer wie ich es bin sowieso :D).
Hat auch alles auf Anhieb geklappt, musste nurnoch das array als var definieren.

Das mit dem findcomponent find ich trotzdme noch etwas verwirrend, bis jetzt weiss ich eigentlich nicht wo genau der zusammenhang mit der funktion und dem ausdruck des namens ("finde komponente") besteht... eigentlichs jetzt der doch bloss wörter zusammen.

also super thx! Hast mir echt geholfen, son kleiner quellcode ist doch was viel schöneres :hello:

mfg
Helmut

Christian Seehase 22. Nov 2002 23:39

Moin Helmut,

vereinfacht gesagt:
Alles was Du so an visuellen Dingen auf ein Formular packst sind Komponenten. Also TEdit, TButton usw.
Um diese zu verwalten werden sie von Delphi in einem Array gespeichert, und können dann, z.B. anhand ihres Namens, dort gefunden werden.
Das ist ungefähr vergleichbar mit der Methode IndexOf einer (sortierten!) TStringList.
Deshalb dürfen Namen auch nicht doppelt vergeben werden.

Nochmal kurz zu

Zitat:

Zitat von Helmut
Ich meide irgendwie immer arrays weil man schnell nen fehler einbaut und den nichtsoschnell findet

Ich finde, es ist viel fehlerträchtiger, eine lange, und damit unübersichtliche Routine zu haben. ;-)

Helmut 22. Nov 2002 23:53

jo, du hast ja recht.... :oops: :cat:

und danke für die erklärung mit den komponenten - so hab ich das noch garnicht gesehen. Aber eigentlich isses logisch :)

mfg
Helmut

Christian Seehase 23. Nov 2002 00:15

Moin Helmut,

immerhin sagtest Du ja selber schon:

Zitat:

... son kleiner quellcode ist doch was viel schöneres :hello:
Du hattest halt bloss noch nicht die Idee des Wie.

MathiasSimmack 23. Nov 2002 08:00

Zitat:

Zitat von Daniel
wenn Du bereit wärest, die Zahlen in einem Array abzuspeichern, könntest Du den Code durch Verwendung einer Schleife noch weiter komprimieren

´s geht auch ohne Array. Wenn ich mir dies so angucke:
Code:
zahl1:=random(6);
if zahl1=0 then wuerfel1.Picture.LoadFromFile('1.bmp');
if zahl1=1 then wuerfel1.Picture.LoadFromFile('2.bmp');
if zahl1=2 then wuerfel1.Picture.LoadFromFile('3.bmp');
if zahl1=3 then wuerfel1.Picture.LoadFromFile('4.bmp');
if zahl1=4 then wuerfel1.Picture.LoadFromFile('5.bmp');
if zahl1=5 then wuerfel1.Picture.LoadFromFile('6.bmp');
dann komme ich auch ohne Array schon mit zwei Zeilen Code weg. Das kürzt auch ganz schön:
Code:
zahl1:=random(6);
wuerfel1.Picture.LoadFromFile(inttostr(zahl1+1)+'.bmp');
Voilá. :)

Salomon 23. Nov 2002 11:42

Hallo,
als ich diesen Thread gelsen habe, ist mir aufgefallen, das ich auch in meinem Code einige Passagen mit "FindComponent" kürzen kann. Daher stelle ich meine Frage mal in diesen Thread.
Bei folgenden Code habe ich Probleme, kann das daran liegen, das die Edits auf einer anderen Form liegen?

Delphi-Quellcode:
 rellabel1.Caption := progconfig.relname1.Text;
 rellabel2.Caption := progconfig.relname2.Text;
 rellabel3.Caption := progconfig.relname3.Text;
 rellabel4.Caption := progconfig.relname4.Text;
 rellabel5.Caption := progconfig.relname5.Text;
 rellabel6.Caption := progconfig.relname6.Text;
 rellabel7.Caption := progconfig.relname7.Text;
 rellabel8.Caption := progconfig.relname8.Text;
Gekürzt habe ich das dann so. Der Compiler meckert auch nicht rum, aber die Labels erhalten leider keine Caption:
Delphi-Quellcode:
 for i := 1 to 8 do
    Tlabel(FindComponent('rellabel'+IntToStr(i))).Caption := TEdit(FindComponent('progconfig.relname'+IntToStr(i))).Text;
Mfg Salomon

Christian Seehase 23. Nov 2002 13:02

Moin Salomon,

das Problem wird schlicht sein, dass FindComponent eine Methode ist, über die jede Container Komponente (z.B. TForm, TPanel) verfügt.
Dadurch, dass Du nicht angegeben hast, von welcher Kompo Du FindComponent benutzen willst, bezieht sich der Aufruf auf die Komponente, in dessen Methode Du sie aufgerufen hast. Indirekt wird der Aufruf zu self.FindComponent umgewandelt.
Deshalb meckert der Compiler auch nicht, er kann ja nicht "wissen", dass Du die Komponenten eines anderen Containers suchst.

Wenn es bei Dir also (z.B.) heisst:

Delphi-Quellcode:
procedure TForm1.FormCreate...

for i := 1 to 8 do
    Tlabel(FindComponent('rellabel'+IntToStr(i))).Caption := TEdit(FindComponent('progconfig.relname'+IntToStr(i))).Text;
versteht der Compiler das als

Delphi-Quellcode:
procedure TForm1.FormCreate...

for i := 1 to 8 do
    Tlabel(Form1.FindComponent('rellabel'+IntToStr(i))).Caption := TEdit(Form1.FindComponent('progconfig.relname'+IntToStr(i))).Text;
Wenn Du es so abwandelst müsste es funktionieren

Delphi-Quellcode:
procedure TForm1.FormCreate...

for i := 1 to 8 do
    Tlabel([color=red]Form2[/color].FindComponent('rellabel'+IntToStr(i))).Caption := TEdit([color=red]Form2[/color].FindComponent('progconfig.relname'+IntToStr(i))).Text;

Salomon 23. Nov 2002 13:34

Moin Christian Seehase,
danke für die Antwort. Wenn man weiß wie es geht ist es echt einfach, und hält den Code schön kurz und übersichtlich :-)

Mfg Salomon


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz