Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - zufallsausgabe


xan553 - Do 01.02.07 17:24
Titel: zufallsausgabe
hy,

ich habe mir das tut durchgelesen und auch kapiert ^^ keine angst

nun zum thema, ich möchte gerne ein programm schreiben bei dem ich ein paar editfelder habe in die ich etwas eingebe.

wenn ich auf einen button klicke, sonn es die eingaben der editfelder in beliebiger reienfolge in laybels ausgeben

kann ich dies mit "random" bewerkstelligen?

bitte um denkanstoss


Narses - Do 01.02.07 17:36

Moin!

user profile iconxan553 hat folgendes geschrieben:
ich möchte gerne ein programm schreiben bei dem ich ein paar editfelder habe in die ich etwas eingebe.

wenn ich auf einen button klicke, sonn es die eingaben der editfelder in beliebiger reienfolge in laybels ausgeben

kann ich dies mit "random" bewerkstelligen?

Ja. :D

user profile iconxan553 hat folgendes geschrieben:
bitte um denkanstoss

Worüber willst du denn nachdenken? ;)

cu
Narses


xan553 - Do 01.02.07 17:38

über gott und die welt natürlich


und darüber wie ich es mit ramdom bewerkständigen könnte


Narses - Do 01.02.07 17:48

Moin!

Schau dir mal Suche in: Delphi-Forum, Delphi-Library FINDCOMPONENT an, damit solltest du weiter kommen. ;)

cu
Narses


Blackheart666 - Do 01.02.07 17:59

Wolln mal nicht so sein, aber nachschlagen solltest Du was es mit FindComponent auf sich hat. :wink:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
    i:Integer;
begin
  i:=Random(5)+1;
  Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;


xan553 - Do 01.02.07 18:30

ah ok, mit diesem quelltext habe ich mich jetzt auseinandergesetzt,

aber ein prob hab ich noch, ich würde geren verhindern das mir eines meiner labels nichts anzeigt und das mir mehrere labels das selbe anzeigen würde ich auch gerne verhindern


Renegade - Do 01.02.07 18:39

Beispiel:

Du gehst die Edits von a nach z in einer Schleife durch.
Bei jedem Edit ermittelst du per Zufall ein Label
Dann prüfst du ob im Label schon was steht - wenn nein - Label.Caption:=Edit.text
ansonsten neues Label per Zufall ermitteln lassen.

Wenn in den Labels Grundsätzlich schon was steht kann man mit dem Tag-Attribut nochwas anderes in gleicher Art und Weise basteln.

Und ja ich habe ganz bewusst kein Codebeispiel hier gepostet - sollst ja ein bischen dabei lernen.

PS: (Diese Lösung ist nicht ganz fein - sollte aber funktionieren)
PPS: (Diese Lösung ist eigentlich *mist*e - macht aber das was du willst)
PPPS: Wäre schön wenn du selbst rausbekommst wa an dieser Lösung mieß ist!


xan553 - Do 01.02.07 18:53

was daran mieß sein könnte:

ich muss für jedes label eine neue integervariable deklarieren

und wenn ich den code nicht bearbeite, erscheint das ergebniss in der titelleiste des programms


ps habs noch nicht rausbekommen ^^


Renegade - Do 01.02.07 18:55

user profile iconxan553 hat folgendes geschrieben:

ich muss für jedes label eine neue integervariable deklarieren

Wie kommst du darauf?


user profile iconxan553 hat folgendes geschrieben:

ps habs noch nicht rausbekommen ^^

Dann würde ich meinen Vorschlag erstmal testen!


xan553 - Do 01.02.07 19:13

user profile iconRenegade hat folgendes geschrieben:
user profile iconxan553 hat folgendes geschrieben:

ich muss für jedes label eine neue integervariable deklarieren

Wie kommst du darauf?


wenn ich diesen code benutze:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  Edit:Array[1..4]of TEdit;
  i:Integer;
 begin
  i:=Random(10)+1;
    label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
end;


end.


zeigen mit label1 und 2 immer das selbe an,

benutze ich aber statdessen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  Edit:Array[1..4]of TEdit;
  i:Integer;
  i1:integer;
begin
  i:=Random(10)+1;
  i1:=Random(4)+1;
  label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i1))).Text;
end;


end.


variieren( hoffe das schreibt man so) meine ergebnisse

udn noch was, ist dein vorschlag für jedes editfeld eine schleife zu machen nicht etwas aufwendig?


xan553 - Do 01.02.07 19:57

also ich hab da mal en paar sachen versucht aber es klappt nichts zum bleistifft:


Delphi-Quelltext
1:
2:
IF label1.caption = ''
    then label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;


Blackheart666 - Do 01.02.07 20:00

Den Array kannst Du weglassen, hatt Ich nur vergessen zu löschen.
Und variablen kannst Du zusammenfassen mit Komma getrennt.
var
i,j,k,l:Integer


Renegade - Do 01.02.07 20:13

Ungetestet und nur auf die schnelle da hin geschrieben



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure wuerfeln;
var i, n: integer;
    frei: boolean;
begin
  frei:=false;
  n:=0;
  for i:=1 to 5 do
    begin
      while Frei<>true do
        begin
          n:=random(5)+1;
          if tLabel(findComponent('Label'+IntToStr(n))).tag<>1 then
            Frei:=true;
        end;
      tLabel(findComponent('Label'+IntToStr(n))).caption:=tEdit(findComponent('Edit'+IntToStr(i))).text;
      tLabel(findComponent('Label'+IntToStr(n))).tag:=1;
      frei:=false;
    end;

end;


Renegade - Do 01.02.07 20:15

Ach ja - und wäre noch schön wenn du mir jetzt sagen könntest wo die Macke in dem Code ist!
Tip: Ablaufgeschwindigkeit / Unnötige Durchläufe...


Robinator - Do 01.02.07 20:58

Die Macke in dem code ist, dass es unter umständen ewig dauern kann. Mal als Beispiel... du hast 100 labels, eins hat noch keine Caption. Nun kann es verdammt lange dauern, bis du per Random auf die entsprechende Zahl kommst.

Ich hab schonmal in nem anderen Thread geschrieben, wie man nen array mit zufallszahlen befüllt, die nur einmal vorkommen ;)

hier nochmal der code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
Procedure CreateRandomBla;
var
  MyArr : Array of Integer;
  RandArr : Array[0..X] of Integer;
  i, ind : integer;
  Procedure Delete(Index : integer);
  var
   i : integer;
  begin
    for i := index to Length(MyArr) - 2 do
      MyArr[i] := MyArr[i + 1];
    SetLength(MyArr, Length(MyArr) - 1);
  end;
begin
  SetLength(MyArr, X + 1);
  for i := 0 to X do
    MyArr[i] := i;
  for i := 0 to X do 
  begin
    ind := Random(Length(MyArr));
    RandArr[i] := MyArr[ind];
    Delete(ind);
  end;
end;


Gruss, Rob


xan553 - Do 01.02.07 21:08

ich glaube nicht das mir der code viel weiter hilft, denn der fehler meines codes liegt denke ich hier


Delphi-Quelltext
1:
if tLabel(findComponent('label'+IntToStr(n))).tag<>1                    


und da sehe ich keinen zusammenhang

danke trotzdem


Robinator - Fr 02.02.07 00:11

Wer lesen kann ist klar im Vorteil :|


JayEff - Fr 02.02.07 01:04

user profile iconxan553 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  Edit:Array[1..4]of TEdit;
  i:Integer;
 begin
  i:=Random(10)+1;
  label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
  i:=Random(10)+1//neue Zufallszahl
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
end;

So vielleicht. Warum eigentlich die Abfrage mit dem Tag? Und wo steht sie eigentlich? Du hast bisher nur gesagt, darin läge der Fehler, nicht wo die Zeile eigentlich steht. Ausserdem redest du von "Deinem Code", den leider bisher noch niemand zu gesicht bekommen hat, wodurch dir auch niemand dabei helfen kann.


Renegade - Fr 02.02.07 09:29

user profile iconRobinator hat folgendes geschrieben:
Die Macke in dem code ist, dass es unter umständen ewig dauern kann. Mal als Beispiel... du hast 100 labels, eins hat noch keine Caption. Nun kann es verdammt lange dauern, bis du per Random auf die entsprechende Zahl kommst.


Verräter ;)


Renegade - Fr 02.02.07 09:32

user profile iconJayEff hat folgendes geschrieben:
user profile iconxan553 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);  
var  
  Edit:Array[1..4]of TEdit;  
  i:Integer;  
 begin  
  i:=Random(10)+1;  
  label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;  
  i:=Random(10)+1//neue Zufallszahl  
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;  
end;

So vielleicht. Warum eigentlich die Abfrage mit dem Tag? Und wo steht sie eigentlich? Du hast bisher nur gesagt, darin läge der Fehler, nicht wo die Zeile eigentlich steht. Ausserdem redest du von "Deinem Code", den leider bisher noch niemand zu gesicht bekommen hat, wodurch dir auch niemand dabei helfen kann.


So wird das nicht funktionieren, da du - wies der Zufall so will - doppelte Werte erhälst und dafür andere Fehlen. Und genau dieses wird mit der in MEINEM Code verwendeten .tag-Abfrage "ausgeschaltet".
Was er mit dem .tag gmacht haben will - keine Ahnung!


JayEff - Fr 02.02.07 17:10

user profile iconxan553 hat folgendes geschrieben:
user profile iconRenegade hat folgendes geschrieben:
user profile iconxan553 hat folgendes geschrieben:

ich muss für jedes label eine neue integervariable deklarieren

Wie kommst du darauf?


wenn ich diesen code benutze:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  Edit:Array[1..4]of TEdit;
  i:Integer;
 begin
  i:=Random(10)+1;
    label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
end;


end.


zeigen mit label1 und 2 immer das selbe an,

benutze ich aber statdessen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  Edit:Array[1..4]of TEdit;
  i:Integer;
  i1:integer;
begin
  i:=Random(10)+1;
  i1:=Random(4)+1;
  label1.Caption:=TEdit(FindComponent('Edit' + IntToStr(i))).Text;
  label2.Caption:=TEdit(FindComponent('Edit' + IntToStr(i1))).Text;
end;


end.


variieren( hoffe das schreibt man so) meine ergebnisse

Ich habe meine Antwort nur auf diesen Post bezogen und klar gemacht, dass man trotzdem mit einer Variable auskommt und nicht soviele Variablen wie Labels braucht.