Autor Beitrag
biohazard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Mi 04.06.03 09:29 
Hallo,

ein besserer Titel ist mir nicht eingefallen. Hab da ein kleines Problem. ich benutze ein image auf dem ich mit moveto/lineto ein gitternetz erstelle.
Dann habe ich da noch ein Edit welches ich mit der mouse verschieben kann. wenn ich die taste loslasse soll das edit am gitternetz ausgrichtet werden, und zwar immer zur oberen und zur linken linie hin. Prüfen tue ich das ganze über den Farbwert des Pixels vom image auf dem sich die oberen linken Ecke des Edits befindet.

An sich funktioniert das ganze ja schon, aber nicht immer. Entweder geht er nicht bis zur oberen linie oder nicht zur linken.

Ich habe keine Ahnung warum das so ist.

Habe auch schon versuch den Quelltext umzustellen. Hilft ja manchmal. Hier mal 2 Beispiele.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
x1:= edit1.Left;
x2:= edit1.Left;
y1:= edit1.Top;
y2:= edit1.Top;

repeat
  x2:=x2-1;
  y2:=y2-1;
until image2.Canvas.Pixels[x2,y2] = clsilver;    //clsilver = Farbe der Linien;

repeat
  x1:=x1-1;
  y1:=y1-1;
until  image2.Canvas.Pixels[x1,y1] = clsilver; 

edit1.left := x2;
edit1.Top := y1;

oder
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
x1:= edit1.Left;
x2:= edit1.Left;
y1:= edit1.Top;
y2:= edit1.Top;

repeat
  if image2.Canvas.Pixels[x2,y2] <> clsilver then x2:=x2-1;
  if image2.Canvas.Pixels[x2,y2] <> clsilver then y2:=y2-1;
  if image2.Canvas.Pixels[x1,y1] <> clsilver then x1:=x1-1;
  if image2.Canvas.Pixels[x1,y1] <> clsilver then y1:=y1-1;
until (image2.Canvas.Pixels[x1,y1] = clsilver) and 
image2.Canvas.Pixels[x2,y2] = clsilver);//image2.Canvas.Pen.Color;

edit1.left := x2;
edit1.Top := y1;

Nur so nebenbei. Gibt es auch andere Komponenten die ich benutzen könnte aus ein Image um ein leeres Blatt darzustellen. TImage oder TForm sind die einzigen bei denen ich Canvas gefunden habe. Vieleicht gibt es ja auch eine komfortablere Lösung als meine.
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 04.06.03 09:44 
Hi,

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:
x1:= edit1.Left;
y1:= edit1.Top;

while true do begin
  x1:=x1-1;
  test := true;
  for counter :=  y1 to y1+edit1.height do
    if image2.Canvas.Pixels[x1,counter] <> clsilver then test := false;

  if test = true then break;
end;

while true do
  y1:=y1-1;
  test := true;
  for counter :=  x1 to x1+edit1.width do
    if image2.Canvas.Pixels[counter,y1] <> clsilver then test := false;

  if test = true then break;
end;

edit1.left := x1;
edit1.Top := y1;


So, habs getestet, funzt ausgezeichnet :D
Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
biohazard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Mi 04.06.03 09:59 
Vielen Dank. Es funktioniert.
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 04.06.03 10:05 
Hi, freut mich.

bau aber lieber noch nen counter rein der immer prüft ob er größer ist als der abstand der gitterlinien, da es sonst zu endlosschleifen kommen kann (falls das bei dir keine endlosschleifen geben kann, dann brauchst du das nicht)

Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
biohazard Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: Mi 04.06.03 10:25 
Innerhalb des Image kann eigentlich nichts passieren. Hab aber gerade gemerkt, daß ich noch ein Ereignis dafür schreiben muß, wenn sich ein teil der Komponente außerhalb des image befindet. Da hängt sich das Programm nämlich auf.

Hab da schon einen Ansatz:

ausblenden Quelltext
1:
2:
if (edit1.Left + edit1.Width) >= (image2.Left + image2.Width) then
  edit1.Left := (image2.Left + image2.Width - edit1.Width);


Das müßte ich nun für alle 4 Seiten machen. Gibt es da noch eine schönere Lösung wo nicht so viele rumgerechnet wird. Kann ja sein, daß es für sowas schon extra Befehle gibt.
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mi 04.06.03 20:54 
Hab jetzt keine direkte Antwort auf deine Frage, sondern eine ergänzung zu meinem Code:

Da, wo ich Edit1.Width bzw Height eingesetzt habe, würde eigentlich auch 2 reichen, da dein Gitte nur 1 Breit ist, und sobald 2 nebeneinander bzw untereinanderliegen, liegt es auf einer Linie.

Nur so nebenbei

Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.