Jak pobrać pozycje karetki w memo wyrażoną w pixelach a nie jako numer linii i znaku w linii?
weź to wymnóż przez szerokość i wysokość znaku
Potwoor, masz ręce szybsze niż głowę :] Twoim zdaniem 10 znaków 'iaiaiaia' zajmuje tę samą szerokość co 10 znaków 'IAIAIAIAIA'? :) Powodzenia życzę.
Autor - w D2007 jest właściwość TMemo.CaretPos: TPoint. W D7 tego nie pamiętam, ale nie mam dostępu, więc nie sprawdzę.
ups =]
to przez to że cały czas pracuje na czcionkach gdzie wszystko jest takie same =]
function CarpetPixelPos (var Memo:TMemo) : TPoint;
var MC:TCanvas;
LastLine:String;
begin
MC:=TCanvas.Create;
MC.Handle:=GetDc(Memo.Handle);
MC.Assign(MC.Font); // dzieki TBSO za uwagi na dole odnośnie linijki
Result.Y:=Memo.CaretPos.Y*MC.Textheight('X') ; //wysokosc tekstu zawsze ta sama wiec można wymnożyc
LastLine:=Copy(Memo.Lines[Memo.CaretPos.Y],1,Memo.CaretPos.X); //Kopiujemy tekst z ostatniej linii do pozycji kursora
Result.X:=MC.TextWidth(LastLine); //podajemy jego szerokosc
MC.Free;
end;
Chyba działa dobrze :) Nadaje sie TYLKO do memo (Stała czcionka )
MC.Font :=Memo.Font;
Zawsze myślałem, że takie coś powoduje AV po jakimś czasie, a przypisanie fontów robi się przez Assign ...
niii, w helpie tak podają ( np przy FontDialog )
Nie wiem, w którym helpie tak podają. Wiem, że MOŻE to nie doprowadzić do nieszczęścia - jeśli jest ustawione SetSubComponent - ale tylko wtedy. Spróbuj tak sformułować zdarznie Form1.OnClick:
procedure TForm1.FormClick(Sender: TObject);
var
frm: TForm1;
fnt: TFont;
begin
Fnt := TFont.Create;
try
frm := TForm1.Create(Application);
Fnt := frm.Font; // <------ tu puszczasz w powietrze utworzonego przed chwilą fonta, do tego robisz
// przypisanie WSKAZANIA na font formy
frm.Free; // <------ tu puszczasz w powietrze frm, a razem z nią jej fonta.
// Od tej pory fnt pokazuje w przypadkowy adres pamięci
showmessage(Fnt.Name); // W zasadzie już ta instrukcja może spowodować AV - zależy od organizacji pamięci
Fnt.Name := 'Courier new'; // albo ta
showmessage(Fnt.Name); // albo ta
finally
fnt.Free; // albo ta
end;
end;
Dodatkowo, jeśli dysponujesz Delphi 2007 możesz dać takie cudo w OnCreate i popatrzyć na wynik ZAKOŃCZENIA programu
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := true;
end;
Następnie zamień instrukcję
fnt := frm.Font;
na
fnt.Assign(frm.Font);
i sprawdź efekty.
Myśleć... :]