Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.05.2012, 09:32
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 10
По умолчанию отступы в memo1

Вот собственно такая процедурка есть
Код:
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  
Старый 18.05.2012, 12:30
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 10
По умолчанию

Вышел из ситуации таким способом
Код:
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  
Старый 18.05.2012, 12:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

В Sender передаётся объект, который вызвал событие. Логичнее будет
Код:
 (Sender as TForm1).FormActivate(Sender);
З.Ы. Ради интереса: а если менять размер формы и активность - не глючит?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 18.05.2012, 12:56
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от pylsar
Вообще верна ли строчка Form1.FormActivate(Sender) ?
Абсолютно верно
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 18.05.2012 в 13:24.
Ответить с цитированием
  #5  
Старый 18.05.2012, 13:15
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

но, имхо, лучше:
Код:
FormActivate(Self); / FormActivate(Sender);
а то вдруг имя Form1 на FormMain поменяется
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 18.05.2012, 15:28
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от NumLock
а то вдруг имя Form1 на FormMain поменяется
Компилятор в помощь.
__________________
Google в помощь
Ответить с цитированием
  #7  
Старый 18.05.2012, 15:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Ildar-tsr
Компилятор в помощь.
каким местом? если написать:
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  Form1.FormActivate(Sender);
end;
и переименовать форму, то красный Form1 не изменится.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 18.05.2012, 16:26
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от NumLock
то красный Form1 не изменится.
Это и ежику понятно. Проект просто не скомпилется, и компилятор укажет где менять Form1 на FormMain.
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 19.05.2012 в 06:10.
Ответить с цитированием
  #9  
Старый 20.05.2012, 14:39
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

не понятно зачем что-то менять, когда можно просто не писать это?)))
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 21.05.2012, 09:18
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 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  
Старый 21.05.2012, 10:33
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 10
По умолчанию

Вопрос снят
нашёл более подробный код 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  
Старый 03.06.2012, 12:47
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 10
По умолчанию

проблема опять появилась, вставил memo1 на новую форму, а вызывается из она теперь из form1. Закрываю окно form2 с memo1, потом опять вызываю его и отступ снизу увеличивается. Помогите избавиться от этого.
Ответить с цитированием
  #13  
Старый 03.06.2012, 13:03
pylsar pylsar вне форума
Прохожий
 
Регистрация: 11.02.2012
Сообщения: 18
Репутация: 10
По умолчанию

Разобрался сам
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:33.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025