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)

Zeile ausrechen: TStringlist Mausklick pos !

Beitrag von pluto »

Hallo,
meine zweite versuch eine Tstringlist anzuzeigen und den Inhalt markieren zu können ist auch nicht so einfach ! weil ich es einfach nicht hin bekomme das ich aus der Mauszeiger Position den richtigen Index für die TStringList ausrechnen kann ! hier ist mein kompletter Code:

Code: Alles auswählen

function TMyMemo.SetSelItem(mx,my,ex,ey:Integer):TPoint;
var
  fx,fy,fz,fzy,i1,sx1,sx2,t:Integer;
  str:String;
  s:Boolean;
  r:TRect;
  mTest:integer;
begin
  fz:=0; i1:=0; sx1:=0; sx2:=0; fzy:=0; t:=0;
  fy:=0;
  s:=False;
  mtest:=my;
 
{  for fy:=0 to TextView.count-1 do begin
    str:=TextView.Strings[fy];
    fzy:=fzy + Buffer.Canvas.TextHeight(str[1]);
    r.left:=0; r.Right:=Width;
    r.top:=fzy;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str[1])+3);
//    if my-r.Bottom <=3 then
//      r.Bottom:=r.Bottom+(my-r.Bottom) ;
 
    if r.Bottom-my >= 0 then
      t:=r.Bottom-my
    else
      t:=my-r.Bottom;
    Screen.Forms[0].caption:=IntTostr(my) + '\' + IntTostr(r.Bottom) + '\' + intTostr(t) + '\' + IntTostr(Buffer.Canvas.TextHeight(str[1]));
 
    if t <= Buffer.Canvas.TextHeight(str[1]) then
      r.Bottom:=r.Bottom+(t);
 
    ShowMEssage('OK');
    if PtInRect(r,point(mx,my)) then begin
      i1:=fy;
      break;
    end;
  end;}

  i1:=((my div Buffer.Canvas.TextHeight('A')) * Buffer.Canvas.TextHeight('A'));
  i1:=i1 div Buffer.Canvas.TextHeight('A');
  i1:=i1;
//    Screen.Forms[0].caption:=IntTostr(r.left) + '\' + intTostr(r.top) + '\' + intTostr(r.Right) + '\' + IntTostr(r.Bottom) + '|' + Inttostr(mx) + '\' + IntTostr(my);
 
//  if odd(i1) = true then
//    i1:=i1-3;
 
  Screen.Forms[0].caption:=IntTostr(i1) + '\' + IntTostr(my);
  //TextView.strings[i1];
//  if fzy-10 >= my then begin
 
{    for fx:=1 to Length(str) do begin
      fz:=fz + Buffer.Canvas.TextWidth(str[fx]);
      if (fz >=mx) and (s = false) then begin
        s:=True;
        sx1:=fx;
        fz:=0;
      end;
 
      if fz >=Width then begin
        fz:=0;
        continue;
      end;
 
      if s = true then begin
        if fz >=ex then begin
          sx2:=fx;
          s:=False;
          Screen.Forms[0].caption:=copy(str,sx1,(sx2+1)-sx1);
          exit;
        end;
      end;
    end;
//  end;     }
end;       
 
// und gezeichnet wird es so

Code: Alles auswählen

procedure TMyMemo.Paint;
begin
  Buffer.Canvas.TextRect(Rect(0,0,Width,Height),0,0,TextView.Text);
//  Der cuser wird gezeichnet
//  buffer.canvas.pen.color:=clred;
//  buffer.canvas.moveto(ct.x,zi );
//  buffer.canvas.LineTo(ct.x,zi+15);
//  Paintbox1.Canvas.CopyRect(TextRect,buffer.canvas,TextRect)
  inherited Paint;
  Canvas.Draw(0,0,buffer)
end;

so das Problem ist jetzt das der wert bei i1 nicht zur TStringlist passt ! und ich weiß nicht wie ich das in den griff bekommen könnte !

PS:
mein erster Beitrag mit Rechtschreibprüfung !
schön währe eine Strg+Leertasten Funktion für falsch geschrieben Wörter das währe praktisch !
und was im bbcode drin steht sollt er einfach auslassen aber sonst nicht schlecht !
mal schauen ob ich mich damit anfreunden kann !
MFG
Michael Springwald

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

Re: Zeile ausrechen: TStringlist Mausklick pos !

Beitrag von theo »

Ich verstehe deinen Code jetzt nicht wirklich.
Eines kann ich dir aber sagen: Mit einer Stringlist kommst du für einen RichEditor nicht weit.
Ebenso mit der Grössenbestimmung: Buffer.Canvas.TextHeight('A')
Das funzt nur, wenn der Font immer gleich bleibt.

Aber deine Rechtschreibung hat sich wesentlich verbessert! :-)

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 »

ich habe pro TStrinliste einen eintrag in einer TObjektlist.
Dieser eintrag speichert neben der Tstringlist auch noch andere sachen wie z.b. das aussehen des textes!

Wenn ich mit der mausklicke muss ich ja den die A: richtige TSTringlist finden B: ich muss den richtigen index finden C: ich muss die richtige x position finden !

Weil es nur ein test ist habe ich mich jetzt erstmal nur auf eine TStringlist beschrängt ! weil ich denke das reicht !

sobalt ich die schrift konfiguation ändere kommt sie in neue TStringlist ! und wird an der gleichen stell gezeichnet wie vohere nur halt in einem anderen aussehen !

wenn ich was makiere kommt der makiere Text ebenfall in eine andre TStringlist damit ich ihn anderes dastellen kann !
so der hintergrund !

ich habe jetzt probleme mit dem ermitteln der anklicken zeile !
ich weiß nicht warum aber es möchte mir einfach nicht gelingen !

PS: ich bin jetzt unter windows da habe ich die rechschreibhelfe noch nicht eingerechtet ! hole ich aber nach evlt. !

ich hoffe ihr habt das prinzip verstanden die idee habe ich von Christian !
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Und schon ist die Rechtschreibprüfung wieder aus dem Gedächtnis gestrichen ...
Mach es doch gleich ordentlich dann fängst du nicht 3x an :)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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 »

so jetzt bin ich wieder unter Linux, sollte also kein Problem sein oder ?

und habt ihr jetzt meinen Code verstanden ? bzw. mein vorhaben ?
Wenn ja was haltet ihr davon ? und kann mir Jemand sagen was ich falsche mache ? ich habe schon versucht in einer schleife den Index auszurechnen aber leider ohne erfolg ! :(
der Index stimmte nie !
MFG
Michael Springwald

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

Beitrag von theo »

pluto hat geschrieben:und habt ihr jetzt meinen Code verstanden ? bzw. mein vorhaben ?


Nö. Ich kann dir aber sagen wie ich es machen würde, bzw. wie das in der Deklaration hier
viewtopic.php?p=3403#3403
in etwa angedacht ist.

Da gibt's ein Dokument das hält sich eine Liste von Absätzen (TRichParagraph) diese wiederum halten sich Listen von sichtbaren Elementen (TVisibleItem).
Das können Bilder oder Text oder sonstwas sein.
Im Fall von Text ist es dann TTextItem = class(TVisibleItem) dort ist der Text in
fText: TRichString; gespeichert.

Das Einfüllen des Textes (in meiner Übung zunächst noch "von Hand") sieht dann etwas so aus:

Code: Alles auswählen

Para := fDoc.AddParagraph;
   Font.Name := 'Times';
   Font.Size := 14;
   Font.Style := [];
   Para.AddText('Kennzeichnend fr die gesellschaftliche Ordnung des hohen Mittelalters sind ',Font);
   Font.Style:=[fsbold];
   Para.AddText('Lehnsrecht und Grundherrschaft. ',Font);
   Font.Style:=[];
   Para.AddText('Auf der obersten Stufe der '+


Wenn der Text drin ist, wird eine Art "Vor-Rendering" gemacht, d.h. für alle sichtbaren Elemente wird ihre Position im Text errechnet und in den Elementen gespeichert (TRect);
Tatsächlich gezeichnet soll natürlich nur das werden, was gerade sichtbar ist.

Wenn du nun wissen willst auf welchem Element dein Mauscursor ist, musst du durch die Absätze und die sichbaren Elemente loopen und gucken ob irgendwo PtInRect zutrifft. Das musst du natürlich noch mit der Position der Scrollbars abgleichen.

Wenn du dann den Eingabe-Cursor setzen willst, musst du noch schauen wo in dem Element die nächste "Lücke" zwischen zwei Buchstaben ist.

Ganz einfach ist es nicht.

Was das ganze besonders trickreich macht ist, dass man auch noch auf Geschwindigkeit kommen muss und den Speicherbedarf im Auge behalten sollte. Ich würde zum Beispiel einen Font-Cache halten, der die Dimensionen aller Buchstaben der verwendeten Fonts gespeichert hat. Das ist erheblich schneller als jedesmal das System abzufragen mit TextWidth und sowas.

Ich sage jetzt auch nicht, das sei der beste Weg.
Hat jemand eine bessere Idee?

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 »

so ähnlich hatte ich mir das auch gedacht !
nur habe ich Probleme die markierte Zeile herauszufinden !

ich habe das jetzt so versucht:

Code: Alles auswählen

function TMyMemo.SetSelItem(mx,my,ex,ey:Integer):TPoint;
var
  fx,fy,fz,fzy,i1,sx1,sx2,t,h:Integer;
  str:String;
  s:Boolean;
  r:TRect;
  mTest:integer;
begin
  fz:=0; i1:=0; sx1:=0; sx2:=0; fzy:=0; t:=0;
 
  fy:=0;
  s:=False;
  mtest:=my;
  r.left:=0; r.Right:=Width;
  r.top:=0; r.Bottom:=0;
  for fy:=0 to TextView.count-1 do begin
    if PtInRect(r,point(mx,my)) then begin
      i1:=fy;
      break;
    end;
 
    if fy <TextView.count-1 then h:=+1 else h:=0;
    str:=TextView.strings[fy+h];
 
    fzy:=fzy + Buffer.Canvas.TextHeight(str);
 
    r.top:=fzy;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str));
 
//    if (r.Bottom)-my >-1  then
//      t:=(r.Bottom-my)
//    else
//      t:=(my-r.Bottom);
 
//    if t = 0 then t:=1;
//    if t <= Buffer.Canvas.TextHeight(str) then
  //    r.Bottom:=(r.Bottom+t);
 
//    Screen.Forms[0].caption:=IntTostr(mx) + '\'+ IntTostr(my) + '\'+ IntTostr(r.top)+ '\' + IntTostr(r.Bottom) + '\' + intTostr(t) + '\' + IntTostr(Buffer.Canvas.TextHeight(TextView.strings[fy+h])  );
 
//    ShowMEssage('OK');
  end;
//  i1:=((my div Buffer.Canvas.TextHeight('A')) * Buffer.Canvas.TextHeight('A'));
//  i1:=i1 div Buffer.Canvas.TextHeight('A');
  //i1:=i1;
//    Screen.Forms[0].caption:=IntTostr(r.left) + '\' + intTostr(r.top) + '\' + intTostr(r.Right) + '\' + IntTostr(r.Bottom) + '|' + Inttostr(mx) + '\' + IntTostr(my);
 
//  if odd(i1) = true then
//    i1:=i1-3;
 
  Screen.Forms[0].caption:=TextView.strings[i1];;
  //IntTostr(i1) + '\' + IntTostr(my);
  //TextView.strings[i1];
//  if fzy-10 >= my then begin
 
{    for fx:=1 to Length(str) do begin
      fz:=fz + Buffer.Canvas.TextWidth(str[fx]);
      if (fz >=mx) and (s = false) then begin
        s:=True;
        sx1:=fx;
        fz:=0;
      end;
 
      if fz >=Width then begin
        fz:=0;
        continue;
      end;
 
      if s = true then begin
        if fz >=ex then begin
          sx2:=fx;
          s:=False;
          Screen.Forms[0].caption:=copy(str,sx1,(sx2+1)-sx1);
          exit;
        end;
      end;
    end;
//  end;     }

end;

allerdins gibt es da Probleme mal kann ich die erste Zeile anklicken mal die zweite aber dann wieder nicht ! also eigentlich macht er was er möchte ! zwischendurch konnte ich die zweite und die vorletzte Zeile anklicken ich verstehe das nicht !!!!

edit:
ich schaffe es einfach nicht ! der code macht was er will aber nicht das was ich möchte *schnif* wo ist der Fehler in meiner Denkweise ?
es muss ja einen geben sonst würde es gehen !
hier mein aktueller code:

Code: Alles auswählen

for fy:=0 to TextView.count-1 do begin
    if (fy+1 < TextView.count-1) and (fy > 0) then h:=+1 else h:=0;
    str:=TextView.strings[fy];   
    fzy:=fzy + Buffer.Canvas.TextHeight(str[1]);
    r.top:=fzy;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str[1]));
    if (r.Bottom)-my >-1  then
      t:=(r.Bottom-my)
    else
      t:=(my-r.Bottom);
//    if (t <= Buffer.Canvas.TextHeight(str[1])) {and (fy > 2)} then
      r.Bottom:=(r.Bottom+t);
//    /; PtInRect(r,point(mx,my)) then begin
    if (r.top >=my) and (my <=r.Bottom+5) then begin
      i1:=fy;
      break;
    end;
  end;

dieser Code soll die Zeile Ausrechnen aber es klappt einfach nicht !
Der Index ist überall aber nicht in der Markierten Zeile !

PS:
merk ihr es wieder ?
jetzt bin ich unter Linux und dort ist die Rechtschreibhilfe aktiviert !
Allerdings ist das ziemlich nervig jedes Word 100% richtig zu schreiben :x
MFG
Michael Springwald

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

Beitrag von theo »

Tja Pluto, anhand des Code Schnipsels kann ich dir das auch nicht sagen.
Für mich sind auch die wenig aussagekräftigen Variablennamen die du verwendest nicht gerade hilfreich, den Code nachzuvollziehen.

Was ich aber immer mache, wenn ich so ein Problem habe:
Schalt mal beim Menu Start->Startparameter->"Startprogramm verwenden" ein. Dann kriegst du eine Ausgabe-Konsole.
Dann platziere im Code ein Paar Writeln(..);
Writeln "schluckt" fast alles, ohne Typkonversion.

Du kannst z.B. mal sehen, wo deine Mousekoordinaten sind:
writeln(mx,'-',my);

Dann könntest du an einer strategisch richtigen Stelle die Rects ausgeben:

With r do
writeln(Left,'-',Top,'-',Right,'-',Bottom);

Wenn du nicht zuviele Einträge hast, kanns du auf der Konsole schauen welcher Eintrag passen würde oder wieso keiner passt.

Ich finde das manchmal praktischer, als mit dem Debugger zu hantieren.

pluto hat geschrieben:Allerdings ist das ziemlich nervig jedes Word 100% richtig zu schreiben :x

:-)

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 »

Danke für den Tipp ! mit dem Programm im Hintergrund !
naja mx und my sind einfach nur die Mausklick Positionen *G*

EDIT:
nicht schlecht, aber dafür geht er jetzt beim beenden des Programms und des Fensters jedesmal in den Fehlerzustand !
(der Debugger)

EDIT1:
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....
Zuletzt geändert von pluto am Do 25. Jan 2007, 12:00, insgesamt 1-mal geändert.
MFG
Michael Springwald

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

Beitrag von theo »

pluto hat geschrieben:naja mx und my sind einfach nur die Mausklick Positionen *G*

Schon klar, aber die möchtest du ja vergleichen mit den Rechtecken.

pluto hat geschrieben:nicht schlecht, aber dafür geht er jetzt beim beenden des Programms und des Fensters jedesmal in den Fehlerzustand !
(der Debugger)


Naja, nicht immer! ;-)
Du kannst Lazarus natürlich auch von Konsole starten und das Ding wieder ausschalten.
Dann siehst du die Writelns dort, vielleicht gibt's dann aber noch ein paar andere Nachrichten.

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 »

> Schon klar, aber die möchtest du ja vergleichen mit den Rechtecken.
genau ! und ich weiß einfach nicht warum das nicht geht !
ich habe einfach gesagt r.left:=0 r.right= breite des Fensters

und r.top habe ich auf fzy gesetzt das ist der Zähler für die höhe bzw. für den top wert !
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 »

unglaublich jetzt geht es ich habe jetzt einfach auf TextRect versichtet
beim zeichnen und schon geht es wunderbar:

Code: Alles auswählen

procedure TMyMemo.Paint;
var
  i,y:Integer;
begin
  y:=0;
  for i:=0 to TextView.Count-1 do begin
    Buffer.canvas.TextOut(0,y,TextView.Strings[i]);
    y:=y + Buffer.canvas.TextHeight(TextView.Strings[1]);
  end;
 
//  Buffer.Canvas.TextRect(Rect(0,0,Width,Height),0,0,TextView.Text);
//  Der cuser wird gezeichnet
//  buffer.canvas.pen.color:=clred;
//  buffer.canvas.moveto(ct.x,zi );
//  buffer.canvas.LineTo(ct.x,zi+15);
//  Paintbox1.Canvas.CopyRect(TextRect,buffer.canvas,TextRect)
  inherited Paint;
  Canvas.Draw(0,0,buffer)
end;
 
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;
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;
  for fy:=0 to TextView.count-1 do begin
    if fy+1 <= TextView.count-1 then h:=1 else h:=0;
    str:=TextView.strings[fy+h];
    fzy:=fzy + Buffer.Canvas.TextHeight(str);
 
    r.top:=oy;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str))+5;
    oy:=fzy;
 
 
    if PtInRect(r,point(mx,my)) then begin
      i1:=fy;
      break;
    end;
 
 
      WriteLn('r.top: '+IntTostr(r.top) + ' my: '+IntTostr(my)+'\R.Bottom: '+IntTostr(r.Bottom) + '\T' + intTostr(t) + '\TH: ' + IntTostr(Buffer.Canvas.TextHeight(str[1])  ));
  end;
//  i1:=((my div Buffer.Canvas.TextHeight('A')) * Buffer.Canvas.TextHeight('A'));
//  i1:=i1 div Buffer.Canvas.TextHeight('A');
  //i1:=i1;
//    Screen.Forms[0].caption:=IntTostr(r.left) + '\' + intTostr(r.top) + '\' + intTostr(r.Right) + '\' + IntTostr(r.Bottom) + '|' + Inttostr(mx) + '\' + IntTostr(my);
 
//  if odd(i1) = true then
//    i1:=i1-3;
 
  Screen.Forms[0].caption:=TextView.strings[i1];;

prima jetzt geht es weiter *G*
MFG
Michael Springwald

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

Beitrag von theo »

Gratuliere!

Aber nochmal den Tipp:
Du brauchst kein Inttostr und auch keine String-Konkatenation in Writeln. Das macht es ja so praktisch.

statt:
WriteLn('r.top: '+IntTostr(r.top) + ' my: '+IntTostr(my)+'\R.Bottom: ...

kannst du

WriteLn('r.top: ',r.top,' my: ',my,'\R.Bottom: ...

schreiben. Einfach ein Komma dazwischen.

Klappt auch mit booleschen Variablen.
Beispiel:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var a:integer;
 b:boolean;
 c:String;
begin
  a:=23;
  b:=false;
  c:='test';
  writeln(a,' ',b,' ',c);
end;
Zuletzt geändert von theo am Do 25. Jan 2007, 13:22, insgesamt 1-mal geändert.

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 »

irtum geht leider doch nicht !

Code: Alles auswählen

TextView:=TStringlist.Create;
  TextView.add('Dies ist ein Test von Heute, Wie geht es dir so ?');
  TextView.add('608246 Das ist eine Telepfonnummer');
  TextView.add('Der himmel ist blau');
  TextView.add('Das Auto ist rot');
  TextView.add('Wie geht es so ?');
  TextView.add('Heute ist es aber schön !');
  TextView.add('-------------------------');
  TextView.add('Test Test Test Test Test Test');
  TextView.add('Guten Tag wie geht es dir ?');
  TextView.add('Heute ist Winter');
  TextView.add('Draußen liegt schnee');
  TextView.add('Der Wald ist grün !');
  TextView.add('Das Meer sollte Blau sein oder nicht ?');

das ist meine Stringlist ! und nun möchte ich gerne beim drauf klicken die richtige Zeile ermitteln ! und das bekommen ich beim besten willen nicht hin ! ich weiß nicht warum !
es geht nur bis "Das Auto ist rot" danach stimmt der Index nie ! mal ist er zu hoch mal zu tief
hier mein aktueller code:

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;
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;
  for fy:=0 to TextView.count-1 do begin
    if fy+1 <= TextView.count-1 then h:=fy+1 else h:=fy;
    str:=TextView.strings[h];
    fzy:=fzy + Buffer.Canvas.TextHeight(str);
 
    r.top:=oy;
    r.Bottom:=r.top+(Buffer.Canvas.TextHeight(str));
    oy:=fzy;
 
    if PtInRect(r,point(mx,my)) then begin
      i1:=fy;
      break;
    end;
 
 
//      WriteLn('r.top: '+IntTostr(r.top) + ' my: '+IntTostr(my)+'\R.Bottom: '+IntTostr(r.Bottom) + '\T' + intTostr(t) + '\TH: ' + IntTostr(Buffer.Canvas.TextHeight(str[1])  ));
  end;


meine Idee war folgende:
ich zähle einfach die Zeilen und rechne dabei die entsprechenden höhen zusammen !
also r.top ist bei der ersten Zeile = 0 bei der zweiten Zeile sollt r.top den wert von der ersten zeile bottom haben !
und so weiter das geht leider nicht ! ich weiß nicht warum !!!
MFG
Michael Springwald

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

Beitrag von theo »

Und was sagt writeln?

Antworten