AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Kann man diesen Quelltextausschnitt verkürzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Kann man diesen Quelltextausschnitt verkürzen?

Ein Thema von Helmut · begonnen am 22. Nov 2002 · letzter Beitrag vom 23. Nov 2002
Antwort Antwort
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#1

Kann man diesen Quelltextausschnitt verkürzen?

  Alt 22. Nov 2002, 22:58
Hi,

die einzige Möglichkeit die mir dazu einfällt ist findcomponent - das hat aber irgendwie nicht funktioniert
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
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2
  Alt 22. Nov 2002, 23: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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#3
  Alt 23. Nov 2002, 00:26
wow! Ich hätte ja mit allem gerechnet, aber das es so kurz geht hätte ich nicht gedacht *g*!
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 ).
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

mfg
Helmut
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 23. Nov 2002, 00: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 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#5
  Alt 23. Nov 2002, 00:53
jo, du hast ja recht....

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

mfg
Helmut
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 23. Nov 2002, 01:15
Moin Helmut,

immerhin sagtest Du ja selber schon:

Zitat:
... son kleiner quellcode ist doch was viel schöneres
Du hattest halt bloss noch nicht die Idee des Wie.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7
  Alt 23. Nov 2002, 09:00
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á.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#8
  Alt 23. Nov 2002, 12: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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 23. Nov 2002, 14: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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#10
  Alt 23. Nov 2002, 14: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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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