Autor Beitrag
herni
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 14:41 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.WeissSetzt(Sender: TObject);
begin
if {wenn in dem konkret angeklickten TImage muehlstein_leer.bmp geladen ist} then
    "Konkretes Image".Picture.LoadFromFile('muehlstein_weiss.bmp')
    else;
end;


Also ich habe eine Prozedur, auf die von mehreren OnClick Ereignissen auf TImages verwiesen wird. Jetzt hab ich hier zwei Probleme. Zum einen, wie prüfe ich ob in dem konkret angegklicktem TImage (wie gesagt, ich kann da ja nichts festes hinschreiben weil ich nicht weiß welches OnClick Ereignis von welchem TImage die Prozedur aufruft). Und die zweite Sache ist die, dass ich dann wenn das Bild "muehlstein_leer.bmp" geladen ist dem TImage welches geklickt wurde ein neues Bild zuweisen möchte. Kann mir da evtl. jeman weiterhelfen?

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 02.03.06 14:46 
(a) Nimm ein Image als Spielfeld
ausblenden Delphi-Quelltext
1:
    Canvas.Draw (0,0,Bitmap);					

zeichnet dann die entsprechende Bitmap an die Stelle
(b) OnClick (Sender: TObject) gibt den Image1 in Sender zurück
(c) merke Dir in einen Extra-Array, welcher Spielstein wo ist, dann weißt Du auch welches Bitmap wohin kommt!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
herni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 16:51 
OK, aber wie realisiere ich dann jetzt ein OnClick Ereignis? Weil ich hab dann ja nicht mehr die in meinem Fall 24 Bilder als eigenständige Komponente auf meinem Form. Oder wie ist das gemeint?
herni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 17:08 
Es geht im übrigen um das Brettspiel Mühle, hatte ich vergessen zu erwähnen. Ich habe also ursprünglich gedacht ein ganz normales Image als Spielfeld zu nehmen, wie du ja auch geschrieben hast. Da drauf habe ich dann 24 TImages gelegt die alle zum Start ein transparentes .bmp Bild geladen haben. Also quasi leer sind. Nun wollte ich das Setzten der Steine eben so angehen, dass wenn ich eines dieser TImages anklicke geguckt wird ob das Feld leer ist, also das transparente Bild geladen ist und wenn das so ist soll eben ein neues Bild geladen werden. Da ich nun aber nicht für jedes Bild eine eigene OnClick Prozedur machen wollte habe ich alle OnClick Ereignisse auf die selbe Prozedur verwiesen und wollte dann quasi dort gucken welches TImage jetzt die Prozedur ausgelöst hat.

Deinen Vorschlag habe ich insofern verstanden das ich mir eine PaintBox bastel und dann mit Paintbox.Canvas.Draw(x,y,Bild); mir die 24 Felder eben so baue. Und die Information ob das Feld leer ist, mit schwarz oder weiß besetzt ist eben in einem extra Feld speicher. Das heißt also ich baue mir 24 Array mit Koordinaten und der Info ob leer, schwarz oder weiß richtig? Nur mein Problem ist eben nun (also ich bin absoluter Leie :-) ) wie ich nun die OnClick's mache. Kann ich denn sagen wenn ich im Umkreis von was weiß ich 20 Pixeln um x,y klicke rufe eine Prozedur auf?
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 02.03.06 19:59 
Wenn Du weißt auf welche Koordinaten das Bitmap kommt, dann fragst Du einfach ab ob X zwischen DrawX und DrawX+20Pixel etc ist, ja dann diese Kästchen nein, teste das nächste!
OnMouseMove liefert die Koodrinaten das Mausclicks oder du nimmst onMouseUp, dan weißt Du gleich alles!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1337
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 02.03.06 20:39 
wenn ich dich richtig verstanden habe hast du jetzt ein bild das virtuell aus 24 einzelnen feldern besteht.
willst du nun herausbekommen wohin geclickt wurde so verwendest du onMouseUp. dieses liefert dir die position an der die maus loßgelassen wurde mit.
dir ist ja bekannt wie groß jedes einzelne deiner felder ist. (alle sind sicher gleich groß). die position die dir geliefert wird ist relativ zu der linken oberen ecke deines spielfeldes. teilst du nun die mauskoordinaten jeweils durch die breite oder höhe deiner felder kannst du die position der zusätzlichen werte in deinem array bestimmen.

zusWerte:array[0..spielfeldzeilen-1,0..spielfeldspalten-1] of record (deine daten);end;

die berechung für die jeweiligen daten erfolgt dann:

zusWerte[maus-y div feldhöhe, maus-x div feldbreite]

beginnst du die array indices nicht mit null muss du im index jeweils eines addieren.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
herni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 21:48 
Jetzt versteh ich gar nichts mehr :-(

Es muss doch irgendwie möglich sein
1. Bei einem OnClick Ereignis auf ein Image zu prüfen welches Bild da geladen ist oder nicht?
2. Das man in der OnClick Prozedur eben rausbekommt auf welches Image geklickt wurde?

Oder geht das beides etwa nicht?
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1337
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 02.03.06 22:15 
das musst du doch nicht über den sender ermitteln. es ist viel einfacher wenn du dir das in einem extra datensatz merkst.
es ist auch sinnvoller mit nur einem bild zu arbeiten und alle bilder an entsprechende positionen in dieses bild zu zeichen. und genau dafür waren meine ausführungen. eben um zu berechnen auf welches der bilder (die du ja gemeinsam in einem bild anzeigst) gerade geclickt wurde.
so kannst du belibig viele informationen parallel speichern.

eine andere lösung wäre es TImage abzuleiten und so die zusätzlichen werte im image zu speichern.
dann könntest du jedes image einzeln anzeigen und das onClick ereignis verwenden.
du müsstest dann bloß im onClick den sender auf dein abgeleitetes TImage casten und die jeweiligen werte abfragen oder ändern.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TNewImage= class(TImage)
    public
    private
    // deine daten
    // deine proceduren
    // - oder im public (ist aber nicht so fein)
  end

procedure tform1.newImage1Click(Sender:TObject);
begin
  TNewImage(Sender)."deine daten"...
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
herni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Do 02.03.06 22:48 
letzteres scheint das zu sein was ich möchte. Danke! Leider bin ich wie gesagt Leie und mit "casten" kann ich nicht so richtig was anfangen.

Also so sieht das bei mir aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TForm1 = class(TForm)
    Image1: TImage;
    P1: TImage;
    P2: TImage;
    .
    .
    .
    .
    P23: TImage;
    P24: TImage;

    procedure WeissSetzt(Sender: TObject);


So, also ich habe da eben 24 einzelne Images und halt noch das Image1 (Das ist einfach das komplette Spielbrett als Bild (sozusagen der "Hintergrund"))

Was ist bei dir "new"??

Kannst du deine Idee vielleicht an meinem konkreten Code jetzt mal zeigen, vielleicht verstehe ich das dann. Wie gesagt, in der Prozedur WeissSetzt möchte ich jetzt rausbekommen ob nun P1, P2, P3........ oder P24 angeklickt worden ist. Und ich möchte diesem PX dann ein Bild zuweisen, also PX.Picture.LoadFromFile('irgendwas.bmp'); und ich möchte gucken können ob ein bestimmtes Bild geladen ist in PX

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1337
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 02.03.06 23:22 
eigentlich habe ich dir schon alles nötige gezeigt um das problem zu lößen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
...
  procedure WeissSetzt(Sender: TObject);
  begin
    // prüfen was für ein feld man vor sich hat
    // der name des feldes ist gleich dem im objektinspektor angegebenen
    if TImage(Sender).Name='P1' then
      TImage(Sender).Loadfromfile('irgendwas.bmp');
    // das zweite problem könntest du indirekt lößen. und zwar indem du dem integer wert "Tag" verwendest
    // über den jede komponente verfügt.
    // du könntest dort eine zahl speichern die ein bestimmtes bild representiert.
    if TImage(Sender).Tag=0 then // zb. frei
    begin
      TImage(Sender).Loadfromfile('weiss.bmp');
      TImage(Sender).Tag=1;
    end;
  end;
...

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
herni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.03.06 18:34 
Danke Danke Danke :-)

Jetzt hab ich das begriffen und auch gleich probiert. Und es funktioniert, auch die Idee mit dem Tag ist Klasse. Da mach ich einfach ne 0 für leer 1 für weiss und 2 für schwarz. Also Vielen Dank, hast mir sehr geholfen.

P.S.: Du bist mein Held :-)