![]() |
|
|
#1
|
|||
|
|||
|
Вот собственно такая процедурка есть
Код:
procedure TForm1.Memo1Change(Sender: TObject); var Rect: TRect; begin SendMessage( Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect)); Rect.Left:= 10; Rect.Top:=10; SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect)); Memo1.Refresh; end; Создающая отступы по 10 пикселей сверху и слева. Однако при загрузке другого файла в ту же memo1 снизу съедается 10 пикселей видимого диапазона, и так при каждой загрузке до того момента пока видимой не остается одна строка, остальные строки попадают в невидимый диапазон и просмотреть их можно только движением вертикального скрола. Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Memo1.Repaint;
Memo1.Lines.LoadFromFile('F:\1\'+ ComboBox1.Text);
Memo1.SelStart:= 0;
Memo1.SelLength := 0;
end;Как избавится от этого ? |
|
#2
|
|||
|
|||
|
Вышел из ситуации таким способом
Код:
procedure TForm1.FormActivate(Sender: TObject); var Rect: TRect; begin SendMessage( Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect)); Rect.Left:= 10; Rect.Top:=10; SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect)); Memo1.Refresh; end; procedure TForm1.FormResize(Sender: TObject); begin Form1.FormActivate(Sender); end; Вообще верна ли строчка Form1.FormActivate(Sender) ? |
|
#3
|
||||
|
||||
|
В Sender передаётся объект, который вызвал событие. Логичнее будет
Код:
(Sender as TForm1).FormActivate(Sender); |
|
#4
|
||||
|
||||
|
Цитата:
![]() Последний раз редактировалось Ildar-tsr, 18.05.2012 в 13:24. |
|
#5
|
||||
|
||||
|
но, имхо, лучше:
Код:
FormActivate(Self); / FormActivate(Sender); ![]() |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.FormResize(Sender: TObject); begin Form1.FormActivate(Sender); end; |
|
#8
|
||||
|
||||
|
Цитата:
Последний раз редактировалось Ildar-tsr, 19.05.2012 в 06:10. |
|
#9
|
||||
|
||||
|
не понятно зачем что-то менять, когда можно просто не писать это?)))
|
|
#10
|
|||
|
|||
|
Так с отступами то разобрался, а как отступы при печати организовать ?
Использую процедуру PrintStrings. Код:
procedure TForm1.Button4Click(Sender: TObject); begin // printer.canvas.font := Memo1.font; Printer.canvas.font.Name:='Arial'; Printer.canvas.Font.Size:=9; PrintStrings(Memo1.Lines); end; |
|
#11
|
|||
|
|||
|
Вопрос снят
нашёл более подробный код PrintStrings Код:
procedure PrintStrings(S: TStrings; Font: TFont; Title: string);
var
LeftMargin, TopMargin, LineCoord, LineOnPage, LinesOnDoc,
CurrentLine, TextHeight, LinesPerPage, LineInterval: integer;
procedure StartDoc;
begin
LinesOnDoc := S.Count;
Printer.Canvas.Font.Assign(Font);
Printer.Canvas.TextOut(0, 0, ' ');
LeftMargin := (Printer.Canvas.Font.PixelsPerInch) div 2;
TopMargin := (Printer.Canvas.Font.PixelsPerInch) div 2;
TextHeight := Abs(Printer.Canvas.Font.Height);
LineInterval := TextHeight + (TextHeight div 2);
LinesPerPage := (Printer.PageHeight - TopMargin) div LineInterval;
CurrentLine := 0;
end;
function MorePages:boolean;
begin
Result := (CurrentLine < LinesOnDoc) and
not Printer.Aborted;
end;
procedure StartPage;
begin
LineOnPage := 0;
LineCoord := TopMargin;
end;
procedure NextPage;
begin
if MorePages then Printer.NewPage;
end;
function MoreLines:boolean;
begin
Result := (LineOnPage < LinesPerPage) and
(LineOnPage < LinesOnDoc) and
not Printer.Aborted;
end;
procedure NextLine;
begin
Inc(LineOnPage);
Inc(LineCoord, LineInterval);
Inc(CurrentLine);
end;
procedure PrintLine;
begin
Printer.Canvas.TextOut(LeftMargin, LineCoord, S.Strings[CurrentLine]);
end;
begin
Printer.Title := Title;
Printer.BeginDoc;
StartDoc;
while MorePages do
begin
StartPage;
while MoreLines do
begin
PrintLine;
NextLine;
Application.ProcessMessages;
end;
NextPage;
end;
Printer.EndDoc;
end; |
|
#12
|
|||
|
|||
|
проблема опять появилась, вставил memo1 на новую форму, а вызывается из она теперь из form1. Закрываю окно form2 с memo1, потом опять вызываю его и отступ снизу увеличивается. Помогите избавиться от этого.
|
|
#13
|
|||
|
|||
|
Разобрался сам
|