Einzelnen Beitrag anzeigen

Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

Mapscreen - Verbesserungsvorschläge, andere Lösungsansätze?

  Alt 4. Mai 2005, 15:07
Moin zusammen!

Ich hab vor, mir für mein neues Project einen kleinen Mapscreen für strategische Planungen
zu proggen. Funktioniert alles so ziemlich. Im Grunde kann ich die Karte jetzt per drag and Drop mit
der rechten Maustaste auf dem Form verschieben, und zusätzlich die karte nach allen Richtungen
scrollen. (Mauszeiger außerhalb des Forms) Allerdings finde ich meinen Code nicht gerade
super elegant und zweckgerichtet. *Ich denke Luckie wird sich erstmal an den Hals fassen und Aufschreien wollen* Das Ganze basiert auf der Umrechnung von Globalen Maus Coords mit
der Maus-CLientcoords von Image1 und den Variablen Form1. left / with bzw. Form1. top / height.

Eines stört mich allerdings, wenn ich das Bild draggen will und ich komme mit dem mauszeiger über
die Fomulargrenzen hinaus, faengt er sofort an zu scrollen. ich will aber das er nur scrollt, wenn
keine maustaste gedrückt ist. Dazu muesste ich den Globalen Status der Maustasten abfragen koennen und
ich weis leider nicht wie. Bei den Globalen Coordinaten gibst dafür ja GetcursorPos, da ist das kein Problem.

Vielleicht hatt ja jemand einen ganz anderen viel eleganteren Loesungsweg in der Hinterhand


Waere nett wenn jemand Vorschläge haette. THX schonmal im vorraus.

Mein BeispielProject ist im Anhang

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);


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

var
  Form1: TForm1;
  helper:boolean;
  terrorx,terrory:Integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (mouse.cursorpos.x > form1.Left) and (mouse.cursorpos.x < form1.Left+form1.width) and
   (mouse.CursorPos.y>form1.Top) and (mouse.CursorPos.y < form1.top+form1.height) And (helper=true) then
   begin
   image1.left:=-terrorx+mouse.cursorpos.x-form1.left;
   image1.top:=-terrory+mouse.cursorpos.y-form1.top;
   end
   else
   begin
   helper:=false;
   //exit;
   end;


if helper=false then
begin
if (mouse.cursorpos.x<form1.Left) and (image1.left<=30) then image1.left:=image1.left+15;
if (mouse.cursorpos.x>form1.Left+form1.width) and (image1.Left+image1.width>=form1.width-30) then image1.left:=image1.left-15;
if (mouse.cursorpos.y<form1.top) and (image1.top<=30) then image1.top:=image1.top+15;
if (mouse.cursorpos.y>form1.top+form1.height) and (image1.top+image1.height>=form1.height-59)then image1.top:=image1.top-15;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssright in shift then
  begin
  terrorx:=+x+4;
  terrory:=+y+30;
  helper:=true;
  end
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
helper:=false;
end;


end.

So long,

euer Richard


PS: bitte sein nachsichtig mit mir Luckie , der Code ist von heute früh 1.30 - 3.30 Uhr

//Edit Project ist leider zu Groß zu Hochladen ca. 8Mb, deswegen mal meine unit1.pas-datei
//Edit benoetigt werden ein TTimer und ein TImage, wobei das bild groeßer als das Form sein muss, sonst ist das ja kein Problem. hehe
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat