Pozycja karetki w pixelach

0

Jak pobrać pozycje karetki w memo wyrażoną w pixelach a nie jako numer linii i znaku w linii?

0

weź to wymnóż przez szerokość i wysokość znaku

0

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ę.

0

ups =]
to przez to że cały czas pracuje na czcionkach gdzie wszystko jest takie same =]

0
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 )

0
MC.Font :=Memo.Font;

Zawsze myślałem, że takie coś powoduje AV po jakimś czasie, a przypisanie fontów robi się przez Assign ...

0

niii, w helpie tak podają ( np przy FontDialog )

0

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ć... :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1