Autor Beitrag
ShinShan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 08.08.06 16:15 
Hi,

ich Programmiere seit einiger Zeit an einem Spiel, welches sich über Netwerk spielen lässt. Ich bin jetzt an dem Punkt, an dem ich eine Map gestalten muss. Prinzipiell ist diese KArte in viele kleine einzelne Kästchen aufgeteilt etwa so:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 - - - - - - - - - 
|a|b|c|d|e|f|g|h|i|
 - - - - - - - - -
|a|b|c|d|e|f|g|h|i|
 - - - - - - - - -
|a|b|c|d|e|f|g|h|i|
 - - - - - - - - -
|a|b|c|d|e|f|g|h|i|
 - - - - - - - - -


die Buchstaben stehen hier in dem Kästchen.
Jedes Kästchen soll einzeln anklickbar sein.

Komme ich da nicht drum herum für jedes Kästchen ein einzelnes Panel zu verwenden? Ich bräuchte 144 von denen.

Das wir dann mit der Zeit total unübersichtlich.

Außerdem müsste ich für jedes Panel eine eigene PanelClick Prozedure haben.

Bekommt man es auch irgendwie hin so eine Karte zu generieren, ohne für jedes Teil der Karte eine eigene Click-prozedur zu schreiben?

Moderiert von user profile iconGausi: Code-Tags hinzugefügt
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 08.08.06 16:30 
ja mit einem TImage oder einer TPaintbox oder direkt das Canvas von TForm benutzen
Fabian W.
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Di 08.08.06 16:55 
oder du erstellst deine panels und proceduren dynamisch... dazu findest du genug topic im Forum, such einfach mal nach "Komponenten dynamisch erstellen" o.ä. ...

mfg
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 08.08.06 17:04 
user profile iconFabian W. hat folgendes geschrieben:
oder du erstellst deine panels und proceduren dynamisch... dazu findest du genug topic im Forum, such einfach mal nach "Komponenten dynamisch erstellen" o.ä. ...

Genau! Und als OnClick-Ereignis weist du jedem Panel eine Prozedur mit Sender: TObject zu. In der Prozedur weißt du dann, welches Panel gedrückt wurde.
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Di 08.08.06 19:10 
ich würde ne eigene visuelle Kompo schwind machn.
Einfach von TGraphicControl ableiten und die breite durch die feldanzahl machn und dann die linien zeichnen, um rauszufinden welches der felder geklickt wurde dann einfach das selbe rückrechnen (am besten mit einer public function (function PointToKoordinaten(x,y:integer;var a,b:integer);).
wenn du dann noch spizelle bilder zeichnen willst nimmste en image sammlung und lässt sie dir an den knotenpunten zeichnen.
von 144 panels rate ich strikt ab!
mfg huhn

//edit: es gibt noch viele weitere vorteile, so kannst du die karte dann variable erweitern verkleinern. Systemauslastung ist geringer und arbeitsspeicherschonender!
//edit2: wenn es dir um die schönen rahmen geht^^ das kannste dann au mit Canvas.FrameRect(); machn ;)

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 08.08.06 19:54 
wow danke für die schnellen Antworten.
Das werde ich dann morgen alles mal versuchen auszuprobieren und mal schaun was am besten geht....
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Di 08.08.06 20:10 
im anhang en schnelles fertiges bsp
Einloggen, um Attachments anzusehen!
_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*


Zuletzt bearbeitet von huhn am Di 08.08.06 20:49, insgesamt 1-mal bearbeitet
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 08.08.06 20:26 
bsp datein sind tatsächlich maps, aber eher für quake 3 und half life *g*
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 08.08.06 20:42 
@ F34r0fTh3D4rk
Also ich hab mir deine Map mal angesehen und es gibt 2 Dinge die ich nciht verstehe:

1. property KartenBreite:integer read FKartenBreite write FKartenBreite;

Was ist eine Proberty und was tut das read und write?

2. procedure TMap.PointToKoord(x,y:integer;var KartenX,KartenY:integer);
var tx,ty:real;
begin
tx:=x/(width/FKartenbreite);
ty:=y/(height/FKartenhohe);

was bedeut width und height? die sind nirgends definiert!
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 08.08.06 20:43 
an sonsten ist das genau das was ich haben wollte.
Also es ist genau richtig und genauso sollte es auch funktionieren.

Danke.

Ich werde dann mal sehen ob ich das auch selber hin bekomme, wenn ich weis was die oben genanneten Dinge sind.
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Di 08.08.06 20:46 
zu propertys, schau am besten mal im forum ;)
width und height sind die breite und höhe der komponente ^^
man könnte auch Self.Width sagen, dazu bin ich aba zu faul xD
das mit dem umwandeln muss ich mir nochmal anguckn, wegen dem auf der linie klickn, da soll es nänlich dann -1 rausgeben damit man weiß das er net getroffen hat.
aber ansonsten solltest mit dem ding eigentlich relativ gut klarkommen.

@F34r0fTh3D4rk: uppps peinlich^^ gleich mal korrigieren

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 09.08.06 10:02 
ja sorry sollte eigentlich

@ huhn da oben stehen..... peinlich..... sorry nochmal
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 09.08.06 12:08 
so also ich werde jetzt wahrscheinlich die Panels dynamisch erzeugen lassen.
Das geht ganz gut und ist auch einfach zu realisieren.
Das mit dem Sender werde ich dann auch übernehmen.

Aber 2 Fragen habe ich noch:

Wenn ich jetzt durch den Sender das Panel herausbekomme, das angeklickt wurde, was genau (also in Buchstaben) übermittelt denn der Sender eigentlich?

Und wenn ich jetzt weis, welches Panel angesprochen wurde, und dieses Panel seine aktion durchführen soll (alles andere), da brauch ich doch einen case ... of befehl oder?
In der art:
case Sender of
Panel1:
Panel2:
Panel3:
.
.
.

Das ist auch bei 144 zu viel Schreibarbeit.

Achso und gibt es eine Möglichkeit eine Gruppe von Panels dynamisch zu verändern?

z.B. for i:=1 to x do
panel[i].caption:='Hallo';
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 09.08.06 12:09 
schau mal nach Suche in: Delphi-Forum, Delphi-Library FINDCOMPONENT
Fabian W.
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Mi 09.08.06 13:56 
Der Sender is vom Typ TObject. Ansprechen kannste die entsprechende Kompo also so:
ausblenden Delphi-Quelltext
1:
TPanel(Sender).caption := 'Ich wurde geklickt';					


F2 brauchste kein FindComponent:
ausblenden Delphi-Quelltext
1:
2:
for i:=1 to x do
Felder[i].caption:='Hallo';
Is da vollkommen richtig wenn die Panels so erstellt wurden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var Felder: array[0..143] of TPanel;
//...
For x := 0 to Length(Felder) - 1 do
  begin
  Felder[x] := TPanel.create(self);
  //...
  end;


mfg
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 09.08.06 15:38 
jaa!!!!

genau das brauchte ich.... so simpel!!!!!!!!!!!!!!
ein Array of TPanel... super geht!!!!!

kommt gleich rein in den Quelltext!

DANKE
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Mi 09.08.06 17:48 
*schüttel* 144 panels...
wenn du nur Klick abfragen willst, sollte die grid.zip von www.fw-web.de/units.htm etwas für dich sein. Bei Drag&Drop wirds dann schwieriger...

HTH Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 09.08.06 19:20 
Also ich habs gemacht wie es da oben steht, und Delphi zeigt auch keinen Fehler an.

Allerdings sehe ich die erzeugten Panels nicht. hab auch schon die Farbe und so geändert, aber nichts zu sehen.

Muss ich wenn ich sowas mache auch ein handle benutzen?
ShinShan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 09.08.06 19:52 
Das Grid Prog ist auch nicht schlecht.

Es is vor allem sehr einfach zu verstehen.

Aber geht es auch nachdem man rausgefunden hat, welches grid der User getroffen hat, dort dann ein Bild einzufügen?

quasi ein TImage dynamisch an der Stelle zu erzeugen?
.... hab mit Timage und so noch keine Erfahrung. :(
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Mi 09.08.06 21:25 
warum Bild einfügen?
male einfach eins...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var b:TBitmap;
begin
  b:=TBitmap.create;
  b.loadfromfile(...);//oder aus resource
  canvas.draw(posx,posy,b); //posx,posy mithilfe der konstanten des grids errechnen
  b.free;
end;


HTH Frank

_________________
EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt :) )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3