Autor Beitrag
Bumpy Johnson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Do 05.02.04 15:09 
Hallo,

ich versuche ein ganz normales Grid zu programmieren! Das Grid bekomme auch hin und zwar so:

ausblenden Delphi-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:
var
w, h, i : integer;
begin

i := 0;
w := paintbox.Width;
h := paintbox.Height;

with paintbox do begin

  canvas.pen.mode := pmNotXor;
  canvas.pen.Style := psdot;
  canvas.pen.Width := 1;


  repeat
    canvas.MoveTo(i,0);
    canvas.LineTo(i,h);
    i:= i +20;
  until i > w;

  i := 0;
  repeat
    canvas.MoveTo(0,i);
    canvas.LineTo(w,i);
    i := i + 50;
  until i > h;


So jetzt möchte ich aber gerne noch, dass ich verschiedene Objekt auf der Paintbox erstelle (so wie Rechtecke und Kreise) Diese Objekte würde ich gerne auf der Paintbox noch bewegen können und dann an dem Grid ausrichten! Meine erste Idee war es das ganze mit der Canvas.OnMouseMove zu realisieren, aber so wurden die Objekte sehr schlecht und ungenau bewegt! Ich hab es auch nicht hinbekommen die Objekte am Grid auszurichten! Danach hab ich im Internet viele Tipps gefunden die sagen, dass man das auch mit dem OnDrag-Event machen kann. Nur leider hab ich kein einzelnen richtigen Quellcode ausschnitt gefunden der das Ganze ein bisschen mehr erklärt!

Meine Frage ist jetzt ob irgend wer vielleicht ein kleinen Tipp, Quellcode oder Idee hat, mit der ich das Ganze programmieren kann?

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
-Bumpy Johnson
rest in Peace
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: So 08.02.04 15:39 
Hallo,

da hast Du etwas vorgenomen. Ok ich habe das bei einem Projekt von mir
folgendermaßen realisiert:

1. Es gibt ein Basisobjekt, welches alle grundlegenden Methoden wie
Create, Destroy, Draw, DrawSelectors, PtInObejkt (Punkt oder Maus befindet sich im Object), SaveToStream, LoadFromStream als virtuelle Methoden enthält.

2. Diese werden das an die eigentlichen Objekte, wie Linien, Kreise, Vierecke u.s.w vererbt und mit Leben gefüllt.

3. Alle Objekte werden in einer Liste vom Typ des Grundobjekts gespeichert. Da alle grundlegenden Methoden virtuell generiert sind reicht es z.B. zum Zeichnen aus, mit einer For-Schleife durch die Liste zu wandern und die Draw-Routinen aufzurufen.

Ich benutzte zum Zeichnen, Verschieben die Ereignisse MouseDown, MouseMove, MouseUp. Das OnDrag-Event eignet sich meiner Meinung nach nur für Objekte die auf Basis der VCL erstellt wurden, wie Shape.

Nun noch ein bischen Code für das Grid-Problem:

Die Routine verschiebt einen Punkt auf das nächste Raster.
Grid ist eine globale Variable, die das Raster enthält.
Für vertikale und horizontale Koordinaten muss die Routine zweimal
aufgerufen werden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// Verschiebt die Korrdinate c ins Grid
function TMainForm.MoveToGrid(c: integer): integer;
begin
  if Grid = 1
  then Result := c
  else
    if c < 0 then
      Result := (c - Grid div 2) div Grid * Grid
    else
      Result := (c + Grid div 2) div Grid * Grid;
end;


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Bumpy Johnson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: So 08.02.04 16:10 
Hallo,

Erstmal danke für die antwort!
Inzwischen, hab ich es auch schon geschaft ein Grid und die Objekte zu zeichnen! Das Bewegen von den Objekten klappt auch schon nur noch nicht ganz flüssig! Aber das ist ein anderes Problem! (Was auch noch gelöst werden muss *g*)
Was noch fehlt ist genau die Funktionen, die du gepostest hast! Ich hab zwar auch schon ne Funktion geschrieben aber die funktioniert noch nicht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function snaptogrid(gridxy, pos : integer) : integer;
var
i, u ,t : integer;
hw : real;
begin

hw := paintbox.Width / 25;

for i:=1 to 25 do begin
  u := trunc(hw * i);
  t := trunc(hw * (i+1));
  if (pos > u ) and (pos < t) then begin

    Result := trunc(hw * i);
  end;
end;
end;


Eine Frage zu deiner Funktion hätte ich auch noch: Was macht den die Variable 'Grid' überhaupt? bzw Was meinst du mit, ''Sie enhält das Raster''? Könntest du mir das nochmal näher erklären?

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
-Bumpy Johnson
rest in Peace
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: So 08.02.04 18:54 
Hallo,

Grid ist der Abstand von einem Rasterpunkt zum nächsten.

ciao

Matthias
Bumpy Johnson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: So 08.02.04 21:31 
hallo,

ich hab so einen wert gar nicht! ich teil nämlich meine Paintbox durch 25 so habe ich halt die Chance den abstand zu ändern! kann ich dann einfach den wert nehmen, der dann dort raus kommst?

ausblenden Delphi-Quelltext
1:
hw := paintbox.Width / 25;					


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt

_________________
-Bumpy Johnson
rest in Peace
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 08.02.04 23:51 
Okay, Leute, dieser Thread war richtig Arbeit. Und ich hasse Arbeit. ;-)
Also bitte nutzt demnächst für Delphi-Source auch die Delphi-Tags und nicht die Code-Tags. Und rückt Euren Quelltext anständig ein, damit ihn auch jemand lesen kann.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Bumpy Johnson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 09.02.04 12:10 
Wenn du das sagst, dann mache ich das sofort! :D

_________________
-Bumpy Johnson
rest in Peace