Zeile ausrechen: TStringlist Mausklick pos !

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ja das gleiche ! das komische ist: wenn ich folgendes mache:
WriteLn('r.top: ',r.top, ' my: ',my,'\R.Bottom: ',r.Bottom, '\T',t,'\TH: ', Buffer.Canvas.TextHeight(str[1] ), 'fy',fy,str);
in der schleife dann hört er in der richtigen Zeile aus die stimmt leider nicht mit
der TStringlist überein ! und das verstehe ich nicht warum das so ist !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

also die werte die ich mit WriteLn erhalte stimmen !
er hört in der richtigen Zeile auf ! nur wenn ich den wert verwende bekomme ich was falsches geliefert !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:also die werte die ich mit WriteLn erhalte stimmen !
er hört in der richtigen Zeile auf ! nur wenn ich den wert verwende bekomme ich was falsches geliefert !


Bist du denn sicher, dass deine Berechnungen stimmen?

Ich hab mal kurz ne Illustration gemacht:
Einfach neues Projekt und den OnPaint handler einbauen.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
const extra=5;
var i, x, y:integer;
var pt:TSize;  //in unit types
begin
 x:=10;
 y:=1;
 Canvas.Brush.Color:=clyellow;
 for i:=0 to 10 do
 begin
  pt:=Canvas.TextExtent('testen');
  Canvas.FillRect(Rect(x,y,pt.cx+x,pt.cy+y));
  Canvas.TextOut(x,y,'testen');
  inc(y,pt.cy+extra);
 end;
end;


Hast du denn keinen Extra Abstand beim Painten (oben Konstante extra) ?
Das sähe ja vollig schlimm aus. Und wenn doch, muss du den dazurechnen.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

beim zeichnen habe ich kein Abstand ! ich zeichne ja jetzt selbst !
und zähle dabei nur eine Variable hoch mehr nicht ohne Abstand .

könnte ich versuchen mit dem extra !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:beim zeichnen habe ich kein Abstand ! ich zeichne ja jetzt selbst !
und zähle dabei nur eine Variable hoch mehr nicht ohne Abstand .

könnte ich versuchen mit dem extra !


Aber dann "kleben" doch die Text-Zeilen aneinander. Bei dir nicht?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

nein !
ich mache das jetzt anders und zwar:
merke ich mir wo ich die Zeile hingezeichnet habe und zwar als objekt:

Code: Alles auswählen

procedure TMyMemo.Paint;
var
  i,y:Integer;
  p:TPoint2;
begin
  y:=0;
 
  for i:=0 to TextView.Count-1 do begin
    p:=TPoint2.Create; p.x:=0;
    p.y:=y;
    Buffer.canvas.TextOut(0,y,TextView.Strings[i]);
 
    TextView.Objects[i]:=p;
    y:=y + Buffer.canvas.TextHeight(TextView.Strings[1]);
  end;


und ich glaube jetzt geht es muss noch ein paar Tests machen aber ich denke schon das ich das Problem erstmal gelöst habe !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

also im Prinzip geht es jetzt:

Code: Alles auswählen

function TMyMemo.SetSelItem(mx,my,ex,ey:Integer):TPoint;
var
  fx,fy,fz,fzy,i1,sx1,sx2,t,h,oy:Integer;
  str:String;
  s:Boolean;
  r:TRect;
  mTest:integer;
  p:TPoint2;
begin
  fz:=0; i1:=0; sx1:=0; sx2:=0; fzy:=0; t:=0;
  oy:=0; fy:=0; s:=False; mtest:=my; r.left:=0; r.Right:=Width;
  r.top:=0; r.Bottom:=0;
  WriteLn('-----------------------');
  for fy:=0 to TextView.count-1 do begin
    p:=TPoint2(Textview.Objects[fy]);
    str:=TextView.strings[fy];
    r.top:=p.y+1;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str))+1;
 
    if PtInRect(r,point(0,my)) then begin
      i1:=fy;
      break;
    end;
    WriteLn('r.top: ',r.top, ' my: ',my,'\R.Bottom: ',r.Bottom, '\T',t,'\TH: ', Buffer.Canvas.TextHeight(str[1]  ), ' fy ',fy);
 
  end;
  WriteLn('-----------------------');
 
  Screen.Forms[0].caption:=TextView.strings[i1];;

er macht nur noch kleine fehler wenn ich zwischen den Zeilen klicke aber ich denke für den Anfang dürfte das reichen oder ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:habe jetzt einfach gesagt lösche beim start die Log Datei !
und keine Meldung mehr beim beenden des Programms !
jetzt gibt es keine Fehlermeldung mehr vom Complier....


Wie macht man das?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

seltsam. ich dachte ich hätte hier geantwortet !
also nochmal:
du gehst über Einstellungen\Debug optionen auf der ersten seite ist eine checkbox !
diese deaktivieren !
MFG
Michael Springwald

Antworten