| Autor |
Beitrag |
suomi85
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 22.12.04 14:31
Wie kann ich realisieren, dass nur ein bestimmtes, per Random ausgewähltes Image angeklickt werden kann?
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Mi 22.12.04 14:35
Setze alle Images auf ein Panel, speichere die Positionen in einem Array. Im OnClick des Panels wertest du die Mausposition (z.B. mit GetCursorPos oder über TMouse) aus, und nur wenn sie über dem vorher mit Random bestimmten Image liegt (Abgleich mit dem Array), führst du einen bestimmten Code aus.
Gruß,
Jörg
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 22.12.04 14:47
Danke, werde das mal ausprobieren.
LG Nina
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mi 22.12.04 16:05
wow, ein mädchen wo programmiert *staun*

|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 22.12.04 23:20
Na ja, is zur Zeit eher gezwungen (Projekt in Info). Aber kann man das Problem auch noch irgendwie anders lösen?
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.12.04 23:25
Moin!
Nun, du könntest die Komponentenzeiger in ein Array tun und dann per Random einen Index auswählen, so als Ansatz. Was genau soll das denn werden?
cu
Narses
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mi 22.12.04 23:50
Ein Spiel, bei dem per random bestimmte Felder ausgewählt werden und nur diese Felder anklickbar sein sollen. Sind zwei Felder nebeneinander angeklickt worden, soll darauf 'n Haus gebaut werden. Na ja, soll...
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 23.12.04 00:08
Titel: Vorschlag nach Ansatz
Kommst du damit weiter?
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| const MAX_IMG = 3;
type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ImageClick(Sender: TObject);
var Form1: TForm1; ImageVector: ARRAY[1..MAX_IMG] of TImage; ActiveImage: Integer;
procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin ImageVector[1] := Image1; ImageVector[2] := Image2; ImageVector[3] := Image3; for i := 1 to MAX_IMG do ImageVector[i].Enabled := FALSE; ActiveImage := 0; end;
procedure TForm1.Button1Click(Sender: TObject); begin if (ActiveImage > 0) then ImageVector[ActiveImage].Enabled := FALSE; ActiveImage := Random(MAX_IMG) +1; ImageVector[ActiveImage].Enabled := TRUE; end;
procedure TForm1.ImageClick(Sender: TObject); var i: Integer; begin i := 1; while ( (i <= MAX_IMG) and (Sender <> ImageVector[i]) ) do Inc(i); if (i <= MAX_IMG) then ShowMessage('Image '+IntToStr(i)+' angeklickt!') else ShowMessage('Fehler! Das Image ist nicht registriert!?'); end; |
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 23.12.04 00:11
guck dir mal den thread an www.delphi-forum.de/....php?p=200660#200660
da gehts um was ähnliches - flächen in einem spiel wird eine clickprozedur zugwiesen.
in der clickprozedur kannst du prüfen ob der index deine random nummer ist.
mfg retnyg
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Do 23.12.04 09:25
| suomi85 hat folgendes geschrieben: | | Aber kann man das Problem auch noch irgendwie anders lösen? |
Das ist mal wieder eine typische Antwort. Da kommt einer mit einem Lösungsvorschlag nicht klar, und anstatt etwas eigenen Quellcode zu posten und Detailfragen zu stellen, wird einfach nach einer anderen Lösung gefragt in der Hoffnung, vollständigen Quellcode zu erhalten. Das ist ziemlich respektlos gegenüber den Leuten, die sich mit deiner Frage beschäftigen.
@Narses: Du könntest dir die Schleife im Im ImageClick noch sparen, indem du die Tags der Images setzt und dann abfragst:
Delphi-Quelltext 1:
| if TImage(Sender).Tag = ActiveImage then |
Bedenkt, dass die Lösung keine überlappenden Images unterstützt, also keine zwei Lösungen zurückliefern kann, woran ich oben auch schon mit gedacht habe. 
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 23.12.04 11:09
Moin!
@.Chef: Ja, klar, ich hätte auch einen OOP-Ansatz genommen, aber beim vermuteten Wissenstand von suomi85 erschien mir eine "einfachere" Lösung mit eher "Informatik-Unterricht"-geprägtem Code sinnvoller (so lernt man beim Code-verstehen wenigstens noch ein bischen was). Aber insgesamt hast du schon Recht, auch mit dem ersten Absatz...
cu
Narses
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Do 23.12.04 22:43
@.Chef: Das Problem is nicht, dass ich mit dem Lösungsvorschlag net klarkomme, sondern eher, dass mir das nicht wirklich hilft, da ich, wenn das Programm fertig ist, die Position von knapp über 100 Images ermitteln müsste, was recht viel Arbeit ist. Außerdem überdeckt das Panel die Images, was auch net ganz so sein soll (kann sein, das man das irgendwie ändern, aber dafür hab ich net genug Ahnung). 'ne Detailfrage kann ich net stellen, da ich das Problem nur allgemein hab und dazu noch kein Quellcaode existiert, aber nur so nebenbei.
@Narses: Mein Wissensstand besteht aus 5 Informatikstunden, reicht dir das als Antwort?
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Do 23.12.04 22:51
| suomi85 hat folgendes geschrieben: | | wenn das Programm fertig ist, die Position von knapp über 100 Images ermitteln müsste, was recht viel Arbeit ist. |
Wo war zum Beispiel diese Information in deinem ersten Beitrag? Wir können dir doch nur helfen, wenn wir wissen, worauf das Ganze hinauslaufen wird. Und im übrigen ist das mit einer Schleife kein Problem.
| suomi85 hat folgendes geschrieben: | | Außerdem überdeckt das Panel die Images, was auch net ganz so sein soll (kann sein, das man das irgendwie ändern, aber dafür hab ich net genug Ahnung). |
Delphi wäre nicht Delphi, wenn das nicht auch ginge. Erstellst du Images zur Laufzeit? Dann:
Delphi-Quelltext
| suomi85 hat folgendes geschrieben: | | 'ne Detailfrage kann ich net stellen, da ich das Problem nur allgemein hab und dazu noch kein Quellcaode existiert, aber nur so nebenbei. |
Aber wie würdest du anfangen? Wie Konfuzius sinngemäß schon gesagt hat: "Auf deinem Weg werden dich viele Hindernisse aufhalten. Doch du wirst nie ankommen, wenn du nicht erstmal losläufst." Und nochmal, dann poste wenigstens mehr Details in der Frage, sonst kommen hunderte Lösungen in Betracht, aber eine genau passende wird kaum dabei sein.
Ach ja, und Hausaufgaben machen wir hier nicht.
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 23.12.04 23:33
Moin!
| suomi85 hat folgendes geschrieben: | | @Narses: Mein Wissensstand besteht aus 5 Informatikstunden, reicht dir das als Antwort? |
Hups, OK.  Das letzte Posting war nicht böse gemeint, so nebenbei noch.
Schätze, du solltest erst noch mal ein bischen mehr mit Delphi "warm" werden. Mach mal ein paar Einsteiger-Tutorials durch, dann wird mein Code klarer; die anderen Vorschläge sind natürlich auch nicht schlecht. Je nach dem, womit du eben besser klar kommst.
cu
Narses
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Fr 24.12.04 00:17
@.Chef: Ich will ja gar keine genau passende Lösung, mir reicht es schon, 'nen Anfang zu haben. Und abgesehen davon ist das auch keine Hausaufgabe, sondern 'n Projekt, was noch dazu freiwillig ist. Außerdem hab ich ja wohl net nach der Lösung für das komplette Teil gefragt, oder? Das mit den 100 Images hab ich im übrigen vorhin erst ausgerechnet, da ich zur Zeit erstmal mit 9 probiere. Und dann noch dazu, wie ich angefangen hätte, eigentlich wollte ich das mit 'ner ganz normalen If-Anweisung ausprobieren, wobei das so irgendwie net klappt, da der Befehl, der mir dazu einfallen würde, in Delphi net so wirklich existiert (und wahrscheinlich in einer anderen Sprache auch nicht...). Images zur Laufzeit??? Damit kann ich grad net soviel anfangen, bin Delphi-Neuling.
@Narses: Na ja, hab vorher mal irgednwann mit Turbo Pascal programmiert, aber das is schon etwas her... Aber als Grundlage für so'n paar Sachen reicht das schon.
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: Fr 24.12.04 09:07
Soso, freiwillig?  Naja, weil heute Weihnachten ist, gibts mal 'ne kleine Demo, wie sowas im Ansatz aussehen könnte:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| uses ExtCtrls;
type TForm1 = class(TForm) procedure ImagesOnClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation var ActiveImage : Integer;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var a : Integer; begin Randomize; ActiveImage:=Random(9); for a:=0 to 8 do begin with TImage.Create(Form1) do begin Parent:=Form1; Visible:=True; Width:=50; Height:=50; Left:=Random(Form1.ClientWidth-50); Top:=Random(Form1.ClientHeight-50); Tag:=a; Name:='Image'+InttoStr(a); OnClick:=ImagesOnClick; with Canvas do begin Brush.Style:=bsSolid; if ActiveImage = a then begin Brush.Color:=clWhite; Pen.Color:=clBlack; end else begin Brush.Color:=clBlack; Pen.Color:=clWhite; end; Rectangle(ClipRect); end; end; end; end;
procedure TForm1.ImagesOnClick(Sender: TObject); var a : Integer; begin if TImage(Sender).Tag = ActiveImage then begin with TImage(Sender).Canvas do begin Brush.Style:=bsSolid; Brush.Color:=clBlack; Pen.Color:=clWhite; Rectangle(ClipRect); end; a:=ActiveImage; repeat ActiveImage:=Random(9); until a <> ActiveImage; with TImage(FindComponent('Image'+InttoStr(ActiveImage))).Canvas do begin Brush.Style:=bsSolid; Brush.Color:=clWhite; Pen.Color:=clBlack; Rectangle(ClipRect); end; end; end;
|
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 26.12.04 16:43
Danke schön für deinen Ansatz. Geht doch auch 'n bissel freundlicher  .
Kann man das ActiveImage einfach so stehen lassen oder könnte man das auch in einer Datei abspeichern (oder wäre das überflüssige Arbeit?)?
|
|
.Chef
      
Beiträge: 1112
|
Verfasst: So 26.12.04 17:40
| suomi85 hat folgendes geschrieben: | Danke schön für deinen Ansatz. Geht doch auch 'n bissel freundlicher . |
Ich hoffe, der Effekt bleibt auch erhalten, wenn ich mal keine Quelltexte poste.
| suomi85 hat folgendes geschrieben: | | Kann man das ActiveImage einfach so stehen lassen oder könnte man das auch in einer Datei abspeichern (oder wäre das überflüssige Arbeit?)? |
Das kommt drauf an. Wenn du ActiveImage beim nächsten Programmstart noch brauchst, musst du's speichern. Ansonsten ists überflüssige Arbeit.
_________________ Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
|
|
suomi85 
Hält's aus hier
Beiträge: 13
|
Verfasst: Di 28.12.04 00:29
Ok, also ist die Datei überflüssig. Mal so als andere Frage, warum erhalte ich eigentlich immer, wenn ich einer Datei schreiben will 'nen E/A-Fehler? (Ich weiß, der Quelltext von mir fehlt da jetzt wahrscheinlich...)
Ich hatte das freundlich auch nicht auf den Quelltext bezogen..
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 28.12.04 01:31
vermutlich weil der betreffende ordner nicht existiert ?
mit if directoryexists(extraxtfilepath(DEIN_DATEINAME_ZUM_SPEICHERN)) then WRITEFILE else showmessage('pfad existiert ned');
kannst du den Fehler abfangen. (oder gleich mit createdir(PFADNAME) anlegen...)
dabei muss DEIN_DATEINAME_ZUM_SPEICHERN ein string sein, der die üblichen MS-DOS Konventionen für Dateinamen einhält also z.b. 'C:\Neuer Ordner\Test\blabla.txt', was voraussetzt dass du weisst wie man nen Backslash macht ^^
|
|
|