Autor Beitrag
Howard
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 03.01.03 19:38 
Also, ich habe mir auf eine dxdraw-fläche über sone dximagelist ein Hintergrundbild bzw eine landkarte anzeigen lassen.Ein Dxtimer löst das ganze aus, das klappt auch soweit...aber nun hab ich noch ein zweites bild in der imagelist, ein kleines...dieses soll sobal jemand auf eine stelle der karte klickt dort gezeichnet werden..mein code dafür sieht so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
 
procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then
    Exit;
  DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0);
  DXDraw1.Flip;
end;

procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
cursorpos: tpoint;
begin
getcursorpos(cursorpos);
dximagelist1.Items[1].draw(DXDraw1.Surface, cursorpos.x,cursorpos.y, 0);
end;

end.


passiert aber nix :shock:

edit:

ok, hatte das dxdraw1.flip; vergessen...jetzt zeigt er es kurz an, aber nur kurz, dann ises wieder weg, und es erscheint auch nich an der mausposition... :(

thx, Howi
Borlox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 191

Win XP
Delphi 6 Enterprise
BeitragVerfasst: Sa 04.01.03 00:50 
Titel: Fehler
Der Fehler liegt darin, dass dein Timer das ganze ja immer wieder neu zeichnet, wie oft, kommt auf den Timer drauf an!
Und wenn du mit der Maus auf den Bildschirm zeichnest, dann macht er das zwar auch, aber sofort wird das ganze wieder von dem Timer wieder übergemalt!
Howard Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 04.01.03 00:58 
ok, hast recht, hab den code vom timer einfach in das oncreate ereignis des formulars geschrieben...nu zeichnet er mal garkein bild...und das andere bild erscheint auch immernoch gut 200 pixel vom mauszeiger entfernt...


gruß Howard
Borlox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 191

Win XP
Delphi 6 Enterprise
BeitragVerfasst: Sa 04.01.03 16:07 
Titel: ???
Poste doch einfach mal deinen Code, dann kann man leichter den Fehler finden!
Howard Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 04.01.03 19:07 
also:
ausblenden volle Höhe 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:
 unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXDraws;

type
  TForm2 = class(TForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}





procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
cursorpos: tpoint;
begin
getcursorpos(cursorpos);
dximagelist1.Items[1].draw(DXDraw1.Surface, cursorpos.x,cursorpos.y, 0);
DXDraw1.Flip;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
if not DXDraw1.CanDraw then
    Exit;
  DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0);
  DXDraw1.Flip;
end;

procedure TForm2.FormActivate(Sender: TObject);

begin
if not DXDraw1.CanDraw then
    Exit;
  DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0);
  DXDraw1.Flip;
end;


end.



so schauts aus
Thunderman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Sa 04.01.03 19:33 
Hallo!

Man macht das prinzipiell so, dass man immer alles neu zeichnen lässt. Dabei guckt man aber, was gerade wo sichtbar ist, und was nicht. In deinem OnTimer zeichnest Du jetzt einfach wie vorher auch die Karte, und immer wenn man mit der Mauklickst, setzt Du eine globale Variable auf True und speicherst auch die Mauskoordinaten ab. Jetzt überprüfst Du in deinem OnTimer, ob die Variable True ist, wenn ja zeichnest Du dein Bild einfach an den gespeicherten Koordinaten, ansonsten lässt Du es einfach bleiben.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Howard Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 04.01.03 21:15 
Ok danke :)

Das funktioniert im Prinzip, nur das wie gesagt das gezeichnete bild nicht am mauscursor erscheint bzw dort wo man hingeklickt hat

ausblenden 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:
procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 var
 cursorpos : tpoint;
begin
 g:= true;
 getcursorpos(cursorpos);
 c:= cursorpos.x;
 d:= cursorpos.y;
end;

//hiermit speicher ich die koordinaten

procedure TForm2.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then
    Exit;
  DXImageList1.Items[0].draw(DXDraw1.Surface, 0, 0, 0);


  if g= true then dximagelist1.Items[1].draw(dxdraw1.surface,c,d,0);
  DXDraw1.Flip;
end;

// zeichen-prozedur


wieso speicher der falsche koordinaten?
Criz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Win XP Prof.
D6 Ent, D7 Ent
BeitragVerfasst: So 19.01.03 02:30 
Zu deinem Problem mit OnCreate:

Zum Zeitpunkt, an dem die Form erstellt wird,
ist DXDraw noch nicht initialisiert. Das dauert etwa
eine halbe Sekunde.
Criz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 18

Win XP Prof.
D6 Ent, D7 Ent
BeitragVerfasst: So 19.01.03 02:40 
Hier mein Vorschlag:

Ich würde das Bild nur neu zeichnen lassen, wenn sich wirklich was verändert, also den Timer ganz rausnehmen und folgendes probieren:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.DXDraw1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer);
begin
  dximagelist1.items[0].draw(dxdraw1.surface, 0, 0, 0);
  dximagelist1.items[1].draw(dxdraw1.surface, x, y, 0);
  dxdraw1.flip;
end;


Eine andere Variante wäre es, den Timer drin zu lassen und ihn immer das
Bild flippen zu lassen.