Entwickler-Ecke

Multimedia / Grafik - Farbenwechseln-Nach zufall?


Pdd - Sa 22.01.05 16:29
Titel: Farbenwechseln-Nach zufall?
Hi @all

Ich habe ne frage: Ich will mit der funktion canvas etwas zeichnen und das soll in einer nach zufall bestimmten farbe passieren. Da ich aber nicht zig-tausende if :lol: abfragen machen will, denke ich das man das auch anders machen kann.

Ich habe schon gesucht aber nichts gefunden. Gibt es da vieleicht ein befehl wie:
canvas.pen.color:=clrandom??? :roll:
Ich wäre dankbar für jeden-auch noch so verrückten vorschlag.


mfg Pdd :roll:


Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am Sa 22.01.2005 um 16:22


Delete - Sa 22.01.05 16:31


Delphi-Quelltext
1:
color := RGB(random(256), random(256), random(256));                    

Edit: Fehler entfernt.


BenBE - Sa 22.01.05 16:34

Einfacher und schneller:


Delphi-Quelltext
1:
Color := Random($01000000);                    


cybersoul - Sa 22.01.05 16:34

Oder besser...

Quelltext
1:
  color := RGB(random(256), random(256), random(256));                    

Sonst kommt niemals Weiß (Rot=255; Grün=255; Blau=255) zustande.


cybersoul - Sa 22.01.05 16:35

Die Möglichkeit von BenBE ist natürlich besser,
ich war nur zu langsam.


Pdd - Sa 22.01.05 16:38

Danke :) :) :)
Funktioniert


Julian W. - Di 05.04.05 22:11

Hi Leute,
habe ein ganz ähnliches Problem. Gibt es eine Funktion, mit der man per random oder so zufällig eine Label ueberschrift auswählen kann?
Mit anderen Worten,
ich habe
- Hallo
- Wie gehts
- Tschüss
zur auswahl(als mögliche label captions) und möchte jetzt eine davon per zufall auswählen. Ist das soweit noch nachvollziehbar was ich meine :?: :?: :?: :?
Natürlich könnte mann mit random eine zufällige Zahl erzeugen und dann mit if die Überschriften zuordnen. Ich habe aber leider 20-30 zur auswahl und das würde mir dann doch zu viel.
Ich hoffe ihr versteht mein Problem und könnt mir helfen.
Viele Grüße Julian
P.s.: Bin nicht wütend aber ich finde den Smiley einfach witzig!! :arrow: :motz:


Kroni - Di 05.04.05 23:26

Case of bla....
oder Definier ein Array of String.....
dort kannst du dann deine Captions einspeichern und die dann per ZUfall aufrufen!


GTA-Place - Mi 06.04.05 06:51

Schreib alle Wörter in eine Stringlist und zeigs dann so an:


Delphi-Quelltext
1:
Label1.Caption := MyStringList.String[Random(20)+1];                    


Wenn als Zufall 15 rauskommt und das 16. Wort = "Hallo" ist, dann ist die Caption des Labels auch "Hallo".


BenBE - Mi 06.04.05 09:08

Ohne +1, da StringListen mit Index 0 anfangen.


Lossy eX - Mi 06.04.05 10:09

Das Beste wäre dann auch noch, wenn du die Größe aus der Stringliste holst. Dann musst du nicht mehr wissen wie viele Texte drin stecken.


Delphi-Quelltext
1:
Label1.Caption := MyStringList.String[Random(MyStringList.Count)];                    


Julian W. - Mi 06.04.05 16:09

Danke schonmal so weit.
Aber mal ne ganz dumme Frage :oops: : Wie erstellt mann denn so eine StringListe?
Ich habe mal in der Delphi hilfe geguckt, das hat mich dann nur noch mehr verwirrt. :? :eyecrazy:
Und im Internet oder hier im Forum hab ich auch nix vernümftiges gefunden.
Kann mann die nicht mit nem memo feld erstellen oder so?? Gruß Julian


Tino - Mi 06.04.05 16:16

user profile iconJulian W. hat folgendes geschrieben:
Wie erstellt mann denn so eine StringListe?

In dem Du das Forum fragst: Suche in: Delphi-Forum, Delphi-Library STRINGLIST ERSTELLEN. Gleich im 2. Topic solltest Du die Antwort finden.

Gruß
Tino


Karlson - Mi 06.04.05 16:23

user profile iconLossy eX hat folgendes geschrieben:
Das Beste wäre dann auch noch, wenn du die Größe aus der Stringliste holst. Dann musst du nicht mehr wissen wie viele Texte drin stecken.


Delphi-Quelltext
1:
Label1.Caption := MyStringList.String[Random(MyStringList.Count)];                    


Na, wenn dann aber richtig ;)


Delphi-Quelltext
1:
label1.caption := MyStringList[Random(MyStringList.Count - 1)];                    


Lossy eX - Mi 06.04.05 16:53

Damit hättest du erfolgreich das letzte Item ausgeschlossen. ;-)

Der übergene Wert stellt nicht den größtmöglichen Wert sondern die Reichweite dar. Da Random bei 0 mit zählen anfängt stimmt deines leider nicht. Siehe auch Beitrag user profile iconcybersoul vom 22.01. ;-)


Julian W. - Mi 06.04.05 16:58

Wäre es dann nicht am geschicktesten, wenn mann die Strings in eine Txt oder ini datei schreibt und sie dann aufruft?

Moderiert von user profile iconAXMD: :?:-Taste war kaputt


zemy - Mi 06.04.05 17:03

Klingt nach kanonen und Spatzen... Was spricht dagegen, die paar Texte direkt im Code zu verankern, wenn du sie nicht wirklich extern brauchst?


Karlson - Mi 06.04.05 17:18

user profile iconLossy eX hat folgendes geschrieben:
Damit hättest du erfolgreich das letzte Item ausgeschlossen. ;-)

Der übergene Wert stellt nicht den größtmöglichen Wert sondern die Reichweite dar. Da Random bei 0 mit zählen anfängt stimmt deines leider nicht. Siehe auch Beitrag user profile iconcybersoul vom 22.01. ;-)



hmmm. da muss ich noch mal nachschauen :lol:


edit: Okay, stimmt. Dein Tippfehler mit dem MyStringList.String[...] bleibt aber ;)


UGrohne - Mi 06.04.05 17:24

user profile iconKarlson hat folgendes geschrieben:
hmmm. da muss ich noch mal nachschauen :lol:

Man, jetzt wollte ich gerade auf Deinen ursprünglichen Beitrag antworten und Du änderst ihn einfach wieder :twisted:

Aber hier der Ausschnitt aus der Hilfe:
Zitat:
Delphi-Syntax:

function Random [ ( Range: Integer) ];

Beschreibung

In Delphi gibt Random eine Zufallszahl im Bereich 0 <= X < Range zurück. Wird der Parameter Range nicht angegeben, liefert Random einen Real-Wert im Bereich

< Range bedeutet also, dass in Deinem Beispiel die Funktion etwas kleiner als 4, also maximal 3 zurückliefern würde, womit das letzte Item niemals angezeigt werden würde ;-)

//EDIT: Musst Du es denn schon wieder editieren? *grrr*


Julian W. - Mi 06.04.05 19:47

user profile iconzemy hat folgendes geschrieben:
Klingt nach kanonen und Spatzen... Was spricht dagegen, die paar Texte direkt im Code zu verankern, wenn du sie nicht wirklich extern brauchst?


Wie soll dass den gehen??
Ich habe hir mal das, was ich bis jetzt geschrieben habe ihr könnt es euch ja mal angucken. Irgendwie geht das nicht und ich weiß nicht wo dran`s liegt. :(

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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  f: string;
   LList: TStringlist;
implementation

{$R *.dfm}

procedure test;

begin
f := 'C:\Programme\Borland\Delphi7\Projects\Neu Textdatei.ini' ;
LList := Tstringlist.Create;
LList.loadfromfile(f);
LList.Free;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := LList.String[Random(LList.Count)];
end;

end.


Gruß Juli

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


Lossy eX - Do 07.04.05 10:15

Also dein Problem ist, dass du die Liste zwar Ordnungegemäß erstellst, sie auch lädst aber dummerweise direkt hinterher gleich wieder frei gibst. Damit bist du dann genau da wo du auch am Anfang gewesen bist. Ich würde im Übrigen keine globale Variablen nehmen sondern diese als Bestandteil des Forms implementieren.

Um mal mit Köpfchen zu Nageln würde ich es so machen.


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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    fList: TStringList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  fList := TStringList.Create;
  fList.LoadFromFile ('');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  fList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if fList.Count then
    Label1.Caption := fList[Random(fList.Count)];
end;

end.


Im OnCreate wird die Liste erstellt und mit Leben gefüllt und im OnClose wird sie wieder gelöscht. In der Zwischenzeit kannst du damit machen was du willst.

Ich würde den fList.Count immer abfragen bevor du auf die Liste zugreifst. Wenn du Random mit 0 aufrufst befindet sich dessen resultat zwischen 0 und 1 auf Fließkommabasis. Abgesehen davon fürt ein Zugrif auf ein nicht vorhandenes Element der Liste dazu, dass du einen Fehler bekommst. Was bei einer ladbaren Textadatei schon passieren kann, wenn jemand dran gedreht hat. ;-)


Julian W. - Do 07.04.05 23:10

@ Lossy eX
Hey, wer sagt's denn :lol: :D :dance: :dance2: :dunce: :party:
Habs endlich hinbekommen!! Vielen, vielen dank für deine/eure Hilfe. Gruß Juli :wink: :mrgreen:


Freeman - Sa 21.05.05 21:06

Hey Leute, mein Problem würde auch dazu passen, und zwar möchte ich ebenfalls die Farbe meines Zeichenstiftes zufällig wechseln lassen, aber ich will, dass es nur zwischen Rot, Blau, Schwarz , Grün und Gelb wechselt.......gibts da ne möglichkeit ???


Greetz

Freeman


OK....hab das Prob jetzt auf andere Weise gelöst....Antwort nicht mehr nötig !!!!! :!: