Zeile ausrechen: TStringlist Mausklick pos !
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
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 !
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
Michael Springwald
Bist du denn sicher, dass deine Berechnungen stimmen?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 !
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;
Das sähe ja vollig schlimm aus. Und wenn doch, muss du den dazurechnen.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
nein !
ich mache das jetzt anders und zwar:
merke ich mir wo ich die Zeile hingezeichnet habe und zwar als objekt:
und ich glaube jetzt geht es muss noch ein paar Tests machen aber ich denke schon das ich das Problem erstmal gelöst habe !
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;
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
also im Prinzip geht es jetzt:
er macht nur noch kleine fehler wenn ich zwischen den Zeilen klicke aber ich denke für den Anfang dürfte das reichen oder ?
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];;
MFG
Michael Springwald
Michael Springwald