Entwickler-Ecke

Multimedia / Grafik - Punkt auf einer Karte markieren


Takeshi - Mi 02.04.03 13:33
Titel: Punkt auf einer Karte markieren
Hallo!

Ich habe eine Karte gemacht, einfach nur ein Raster und möchte nun bei Klick an den Koordinaten des Mauszeigers einen Punkt erstellen. Dieser soll später beim drüberfahren als 'Link' funktionieren.

Also etwas ähnliches wie <area shape=" in einer HTML, nur dass der Radius ruhig immer der selbe sein kann.

Leider habe ich keine Ahnung, wie ich so ein Shape dahinzauber, und diesem dann auch noch Ereignisse zuordne. Habe bisher nur Komponenten aus der Liste eingefügt.

Vielen Dank schonmal! greez, Takeshi


Aya - Mi 02.04.03 14:26

Hi,

wär ganz hilfreich zu wissen auf was für eine Komponente du da klickst.. also auf was du deine Karte zeichnest. ;)

Au'revoir,
Aya~


Takeshi - Mi 02.04.03 14:43

ich klicke auf ein Image (Bitmap), da ja hier eine Karte eingefügt werden soll.


Aya - Mi 02.04.03 14:48

huhu,

also versteh ich das jetzt richtig das die Karte ein einziges großes TImage ist, oder sind es mehrere kleine??

Au'revoir,
Aya


Takeshi - Mi 02.04.03 15:10

jaja, ist ein ganzes. ist soll auch keine besonders große karte sein.


Aya - Mi 02.04.03 15:36

Hi,

dann nimm einfach das OnMouseDown-Event vom TImage.. da hast du dann die X und Y Koordinate wo auf das Bild geklickt wurde :)

Au'revoir,
Aya


Takeshi - Mi 02.04.03 17:33

Das weiß ich auch.

wenn du aber meinen ersten post nochmal durchliest - ich möchte dann an dieser stelle eine Markierung einfügen, wo geklickt wurde. Und wie DAS geht möchte ich gern wissen.

Ich habe nun ein Fake-Programm geschrieben, das die Funktionen simuliert. Nur wird dabei ein Punkt verschoben und nicht wie gewünscht neue Punkte erstellt. Vielleicht wird damit deutlicher, was ich vorhabe.

http://rudel-clanpage.de.vu/map.zip

gruß, takeshi


Aya - Mi 02.04.03 18:04

Hi,

achsoooo.... nu hab ich's kapiert *gg*

Na ja, du speicherst ja die Koordinaten der Punkte immer in der ListBox da am rand..

Speicher sie einfach zusätzlich noch in nen Array:


Quelltext
1:
FeldArray: Array of Array[1..2] of Integer;                    


und ne neue Koordinate hinzufügen:


Quelltext
1:
2:
3:
SetLength(FeldArray,Length(FeldArray)+1);
FeldArray[High(FeldArray),1]:=X;
FeldArray[High(FeldArray),2]:=Y;


Soo... und dann halt jedesmal wenn du die punkte zeichnest mit ner For-Schleife durch den Array gehen:


Quelltext
1:
2:
for i:=Low(FeldArray) to High(FeldArray) do
  ZeichnePunkt(FeldArray[i,1],FeldArray[i,2]);


so in der Art halt.. ;)

War's das was du meintest?? :roll:

Au'revoir,
Aya~


Aya - Mi 02.04.03 18:06

ach halt...

ich seh grad dein Punkt is ja nen Shape.. nich per Canvas draufgezeichnet... :oops:

mach halt nen Array of TShape ;)

und beim neuen hinzufügen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Shapes: Array of TShape;

procedure OnMouseDown(...);
begin
  SetLength(Shapes,Length(Shapes)+1);
  Shapes[High(Shapes)]:=TShape.Create(self);
  Shapes[High(Shapes)].Parent:=self;
  Shapes[High(Shapes)].Left:=X;
  Shapes[High(Shapes)].Top:=Y;
end;


Au'revoir,
Aya~


Takeshi - Mi 02.04.03 20:41

danke!!!
das zieh ich mir erstmal morgen nach meiner physik klausur rein :D
dann habe ich bestimmt wieder ne frage ;)
greez, Take


Takeshi - Do 03.04.03 16:19

OK, das mit dem Array hab ich jetzt alles verstanden *freu*
sowas in der art hab ich mich schon öfters gefragt. Jedenfalls kann ich jetzt prima überall Punkte hinpflanzen.

wie kann ich denn dem Objekt 'Shapes' jetzt ein Ereignis (MouseDown) zuweisen, bzw wie komme ich an den Index des beklickten Shapes ?
[witzige Formulierung...] egal ich bin sicher, du weißt, was ich meine

vielen thx + greez Takeshi


Aya - Do 03.04.03 16:28

huhu,

einfach so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var 
  Shapes: Array of TShape; 

procedure OnMouseDown(...); 
begin 
  SetLength(Shapes,Length(Shapes)+1); 
  Shapes[High(Shapes)]:=TShape.Create(self); 
  Shapes[High(Shapes)].Parent:=self; 
  Shapes[High(Shapes)].Left:=X; 
  Shapes[High(Shapes)].Top:=Y; 

  Shapes[High(Shapes)].Tag:=High(Shapes); 
  Shapes[High(Shapes)].OnMouseDown:=MyMouseDown; 
end;


und in der Procedur MyMouseDown dann:

Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.MyMouseDown(...);
var
  ShapeID: Integer;
begin
  ShapeID:=TShape(Sender).Tag;
  Shapes[ShapeID]....
end;


Au'revoir,
Aya~


Takeshi - Do 03.04.03 18:14

mhh.
ich habe nun

Quelltext
1:
Shapes[High(Shapes)].OnMouseDown:=MyMouseDown;                    

eingefügt und per Hand die procedure

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TfrmMap.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ShapeID: Integer;
begin
  ShapeID:=TShape(Sender).Tag;
  edtShapeID.Text:=FloatToStr(ShapeID);
end;

eingefügt.
Das ist wohl falsch, denn der Index ist immer 0. Leider blicke ich auch noch nicht ganz durch, wo 'Sender' herkommen soll..
gruß, Takeshi


Aya - Do 03.04.03 18:26

Hi,

hast du daran gedacht den "Tag" der Shape festzulegen???

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var 
  Shapes: Array of TShape; 

procedure OnMouseDown(...); 
begin 
  SetLength(Shapes,Length(Shapes)+1); 
  Shapes[High(Shapes)]:=TShape.Create(self); 
  Shapes[High(Shapes)].Parent:=self; 
  Shapes[High(Shapes)].Left:=X; 
  Shapes[High(Shapes)].Top:=Y; 

  Shapes[High(Shapes)].Tag:=High(Shapes);  // <-- DAAA :)
  Shapes[High(Shapes)].OnMouseDown:=MyMouseDown; 
end;


Sender ist einfach das Objekt welches den Event (in dem fall also den OnMouseDown Event) ausgelöst hat.

Au'revoir,
Aya~


Takeshi - Do 03.04.03 18:54

ok es klappt :)

Quelltext
1:
(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer)                    

das muss alles der procedure MyMouseDown übergeben werden oder ?


Aya - Do 03.04.03 19:26

Jep :)