Autor Beitrag
suomi85
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 22.12.04 14:31 
Wie kann ich realisieren, dass nur ein bestimmtes, per Random ausgewähltes Image angeklickt werden kann?
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 22.12.04 14:47 
Danke, werde das mal ausprobieren.
LG Nina
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 22.12.04 16:05 
wow, ein mädchen wo programmiert *staun*
:welcome:
suomi85 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 23.12.04 00:08 
Titel: Vorschlag nach Ansatz
Kommst du damit weiter?

ausblenden volle Höhe 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:
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;
  // alle Images disablen
  for i := 1 to MAX_IMG do
    ImageVector[i].Enabled := FALSE;
  // keins ist aktiv
  ActiveImage := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // wenn ein Image ausgewählt war, deaktivieren
  if (ActiveImage > 0) then
    ImageVector[ActiveImage].Enabled := FALSE;
  // ein zufälliges Image aussuchen
  ActiveImage := Random(MAX_IMG) +1;
  // dieses aktivieren
  ImageVector[ActiveImage].Enabled := TRUE;
end;

procedure TForm1.ImageClick(Sender: TObject);
  var
    i: Integer;
begin
  // Index des angeklickten Images bestimmen
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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. :evil:

@Narses: Du könntest dir die Schleife im Im ImageClick noch sparen, indem du die Tags der Images setzt und dann abfragst:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
Image.Parent:=Panel;					


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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. :wink: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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:
ausblenden volle Höhe 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:
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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 ^^