Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

xXxVov4ikxXx



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А можно это же только с комментами?

Всего записей: 64 | Зарегистр. 26-01-2009 | Отправлено: 13:13 16-04-2009
Dmitriy05



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дано: Программа написанная на Delphi 7 с единственной формой которая при старте имеет WindowState:= wsMaximized.
 
При восстановлении формы (дабл клик на заголовок приложения или нажатия кнопки в системном меню) получаеться что компоненты формы "обрезаються". Для формы были установлены MinHeight/Minwidth.  
 
Новая проблема: После восстановления все компоненты видны, но часть формы вылезает за правую границу экрана. Возникла мысль - отловить событие restore и сделать так чтобы форма становилась в центр экрана.
 
Найдя на http://www.delphisources.ru/pages/faq/base/min_restore_form.html нечто похожее и изменив код получил следующее: (Constraints при этом нулевые)
 

Код:
 
 procedure TMainForm.WMSyscommand(var msg: TWmSysCommand);
 begin
 if (msg.CmdType and $FFF0) = SC_RESTORE then begin
 height:=450;
 width:=900;
 position:=poscreencenter;
 windowstate:=wsnormal;
 end
 else
 inherited
 end;
 

 
При этом после Restore форма прибиваеться к левому верхнему углу экрана. Якоря формы? Убрал - не дает эффекта. Второй замеченый эффект - как будт форма заново перерисовываеться.
 
Больше идей на данный момент нет. Запрещать восстановление не хочу - програма может и лолжна делать это. Но как?

Всего записей: 2514 | Зарегистр. 03-08-2005 | Отправлено: 13:21 16-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xXxVov4ikxXx
пожалуйста
RichEdit.Lines.text := // присвоили значение всего текста
  Trim(RichEdit.Lines.text)+ // удалили все нечитаемые символы в начале и конце текста  
    #13#10+ // добавили перевод строки
   'blabla' // добавили наш текст
 
Dmitriy05
а что мешает сразу в дизайнере присвоить форме
position св-во poScreenCenter

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:26 16-04-2009 | Исправлено: greenpc, 13:30 16-04-2009
xXxVov4ikxXx



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenpc, не пашет, по крайней мере так как надо.  
Вот как у меня устроен вывод:
 Main.History_text.Paragraph.Alignment:=taCenter; //виведемо початковий напис в історію
 Main.History_text.SelAttributes.Color:=clNavy;
// tempstr:=Trim(Main.History_text.Lines.text)+#13#10+'Початок гри';
// Main.History_text.Lines.text := tempstr;
 Main.History_text.Lines.Add('Початок гри');
 Main.History_text.Paragraph.Alignment:=taLeftJustify;
 
Main.History_text.SelAttributes.Color:=clGreen; //вивід ходу гравця в історію
case rezhym of
1: Main.History_text.Lines.Add('Хід '+IntToStr(n_hodu)+', гравець взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки');
2: Main.History_text.Lines.Add('Хід '+IntToStr(n_hodu)+', гравець взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки');
4: If player=1 then Main.History_text.Lines.Add('Хід '+IntToStr(n_hodu)+', гравець 1 взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки')
    else begin
      Main.History_text.SelAttributes.Color:=clRed;
      Main.History_text.Lines.Add('Хід '+IntToStr(n_hodu)+', гравець 2 взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки');
           end;
end;
//tempstr:=Trim(Main.History_text.Lines.text)+#13#10+'Хід '+IntToStr(n_hodu)+', гравець взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки';
//Main.History_text.Lines.text := tempstr;
SendMessage(Main.History_text.Handle, EM_LINESCROLL, 1, 0);
 
Main.History_text.SelAttributes.Color:=clRed; //хід компа (в першому режимі)
// tempstr:=Trim(Main.History_text.Lines.text)+#13#10+'Початок гри';
// Main.History_text.Lines.text := tempstr;
Main.History_text.Lines.Add('Хід '+IntToStr(n_hodu)+', комп''ютер взяв '+IntToStr(n_spi4)+' сірників з '+IntToStr(n_ku4)+' кучки');
 
http://keep4u.ru/full/2009/04/16/f6a42a2b55e19b43c6180f528da0ac64/jpg
После того, как я применил ваш способ у меня получилось то, что на скрине + вобще не пашет ползунок.

Всего записей: 64 | Зарегистр. 26-01-2009 | Отправлено: 13:35 16-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xXxVov4ikxXx
а так

Код:
  with Main.History_text do
begin  
  SelStart := Length(Trim(Text));
  Perform(EM_SCROLLCARET, 0, 0);
  if CanFocus then SetFocus;
end;
 

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 13:58 16-04-2009 | Исправлено: greenpc, 14:00 16-04-2009
xXxVov4ikxXx



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Тогда прокрутка не пашет и цветом не выделяет.

Всего записей: 64 | Зарегистр. 26-01-2009 | Отправлено: 14:08 16-04-2009
greenpc

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xXxVov4ikxXx
у меня все ок

Код:
var
  i: Integer;
begin
  for i := 1 to 20 do begin
    if i mod 2 = 0 then Main.History_text.SelAttributes.Color := clRed
    else Main.History_text.SelAttributes.Color := clGreen;
    Main.History_text.Lines.Add(IntToStr(i));
  end;    // for
  with Main.History_text do begin
    SelStart := Length(Trim(Text));
    Perform(EM_SCROLLCARET, 0, 0);
    if CanFocus then SetFocus;
  end;
end;

Всего записей: 401 | Зарегистр. 18-04-2003 | Отправлено: 14:18 16-04-2009
Dmitriy05



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
greenpc
Поставил poScreenCenter (+ убрал обработку Sc_Restore)
Но после восстановления форма почему-то занимает позицию poDesigned.
Может глюк винды ?
 
XP Pro Sp 2

Всего записей: 2514 | Зарегистр. 03-08-2005 | Отправлено: 14:40 16-04-2009 | Исправлено: Dmitriy05, 14:41 16-04-2009
xXxVov4ikxXx



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Main.History_text.Paragraph.Alignment:=taCenter; //âèâåäåìî íàïèñ â ³ñòîð³þ
 Main.History_text.SelAttributes.Color:=clNavy;
 Main.History_text.Lines.Add('Ïî÷àòîê ãðè');
 Main.History_text.Paragraph.Alignment:=taLeftJustify;
 with Main.History_text do
 begin
  SelStart := Length(Trim(Text));
  Perform(EM_SCROLLCARET, 0, 0);
  if CanFocus then SetFocus;
 end;
 
       Main.History_text.SelAttributes.Color:=clGreen; //âèâ³ä õîäó â ³ñòîð³þ
       case rezhym of
        1: Main.History_text.Lines.Add('Õ³ä '+IntToStr(n_hodu)+', ãðàâåöü âçÿâ '+IntToStr(n_spi4)+' ñ³ðíèê³â ç '+IntToStr(n_ku4)+' êó÷êè');
        2: Main.History_text.Lines.Add('Õ³ä '+IntToStr(n_hodu)+', ãðàâåöü âçÿâ '+IntToStr(n_spi4)+' ñ³ðíèê³â ç '+IntToStr(n_ku4)+' êó÷êè');
        4: If player=1 then Main.History_text.Lines.Add('Õ³ä '+IntToStr(n_hodu)+', ãðàâåöü 1 âçÿâ '+IntToStr(n_spi4)+' ñ³ðíèê³â ç '+IntToStr(n_ku4)+' êó÷êè')
                       else begin
                             Main.History_text.SelAttributes.Color:=clRed;
                             Main.History_text.Lines.Add('Õ³ä '+IntToStr(n_hodu)+', ãðàâåöü 2 âçÿâ '+IntToStr(n_spi4)+' ñ³ðíèê³â ç '+IntToStr(n_ku4)+' êó÷êè');
                            end;
       end;
with Main.History_text do
   begin
    SelStart := Length(Trim(Text));
    Perform(EM_SCROLLCARET, 0, 0);
    if CanFocus then SetFocus;
end;
 
       Main.History_text.SelAttributes.Color:=clRed;
       Main.History_text.Lines.Add('Õ³ä '+IntToStr(n_hodu)+', êîìï''þòåð âçÿâ '+IntToStr(n_spi4)+' ñ³ðíèê³â ç '+IntToStr(n_ku4)+' êó÷êè');
       with Main.History_text do
       begin
        SelStart := Length(Trim(Text));
        Perform(EM_SCROLLCARET, 0, 0);
        if CanFocus then SetFocus;
       end;
 
Если вот так записано, то:
 
1) цветом выделяется токо первая строка
2) при выводе хода что с командой, что без - пустая строка в конце остается, а когда кликаешь на прокрутку, тогда уже курсор поднимается и пустая строка опускается...
3) проблему с прокруткой решил, я просто забыл активировать ричедит...

Всего записей: 64 | Зарегистр. 26-01-2009 | Отправлено: 14:46 16-04-2009
Mandor Sawall

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xXxVov4ikxXx
Добавляйте строку так:
1. Перемещайте курсор в конце текста:
Код:
with Main.History_text do
begin
  SelStart := Length(Text);
  SelLength := 0;
end;
2. Установите атрибуты:
Код:
with Main.History_text do
begin
  SelAttributes.Color := clNavy;
  ...
end;
3. Добавьте строку:
Код:
Main.History_text.SelText := #13#10+sMyNewLine;

Для первая строка не надо добавлять #13#10 в начале. Если нужно выравнивание, делайте его после добавление строки.

Всего записей: 119 | Зарегистр. 20-03-2003 | Отправлено: 15:08 16-04-2009 | Исправлено: Mandor Sawall, 15:11 16-04-2009
xXxVov4ikxXx



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Пасиб огромное - помогло....

Всего записей: 64 | Зарегистр. 26-01-2009 | Отправлено: 16:49 16-04-2009 | Исправлено: xXxVov4ikxXx, 17:17 16-04-2009
bornbill



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно обойти все формы, на них все элементы label и взять с них текст.
Заранее благодарен.

Всего записей: 1440 | Зарегистр. 02-04-2004 | Отправлено: 21:50 17-04-2009
zvAndrey



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Нужно обойти все формы, на них все элементы label и взять с них текст.  

 

Код:
 
  for idx := 0 to Screen.FormCount-1 do
    for n := 0 to Screen.Forms[idx].ComponentCount-1 do
      if (Screen.Forms[idx].Components[n] is TLabel) then
        ShowMessage((Screen.Forms[idx].Components[n] as TLabel).Caption);
 

Всего записей: 132 | Зарегистр. 02-02-2002 | Отправлено: 22:49 17-04-2009 | Исправлено: zvAndrey, 22:55 17-04-2009
Dmitriy05



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема решилась отловом SC_Restore и принудительным установом позиции
 

Код:
 
procedure TMainForm.WMSyscommand(var msg: TWmSysCommand);
begin
inherited;
 case (msg.CmdType and $FFF0) of
 sc_restore :
  begin
  Left:=(screen.Width - width) div 2;
  Top:=(screen.Height - height) div 2;
  end;
 end;
end;
 

 
MinHeight/MinWidth сохранены

Всего записей: 2514 | Зарегистр. 03-08-2005 | Отправлено: 16:32 18-04-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашёл я наконец программу которая сохраняет дату файлов при переходе с летнего на зимнее время. Не в целях рекламы или саморекламы.
http__/cc.codegear.com/Item/24263
Просто знаю, что наверняка не я один из программистов пользуюсь двумя компьютерами. Кто в курсе, что такое синхронизация будет наверное удивлён - прога консольная, без единого компонента и в Delphi5 она компилится. Мой топик тогда прикрыли, наверное ни у кого не было ответов...
 
Добавлено:
да, и, сори за флуд, всё же удивляет безразличие к документу людей любящих оперировать фактами...

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 22:58 21-04-2009
dr1v3



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пишу парсер html. Как можно вырезать из строки эти квадраты? Обычно я делаю в цикле if a[i]='x' then delete(a,i,1) А тут что писать? Как я понял, это символы перехода на новую строку
 

Всего записей: 13 | Зарегистр. 29-04-2008 | Отправлено: 14:25 22-04-2009 | Исправлено: dr1v3, 14:30 22-04-2009
adli82



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если это символ перехода строки то можеш использовать следующий код:
if a[ i ]=#$D then delete(a,i,1)
ещо есть один символ которий тоже может быть "квадратиком":
if a[ i ]=#$A then delete(a,i,1)
Кстати эти символы относятся к управляющим, скорее всего они тебе не нужны вообще, я бы посоветовал убрать их все:
if a[ i ]<#32 then delete(a,i,1)
 

Всего записей: 5 | Зарегистр. 22-04-2009 | Отправлено: 15:29 22-04-2009
dr1v3



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При таком раскладе: for i:=1 to length(a) do if w[a]<#32 then delete(a,i,1);
кол-во квадратиков уменьшается вдвое, но все не исчезают. Как узнать, что это за знак такой?

Всего записей: 13 | Зарегистр. 29-04-2008 | Отправлено: 16:35 22-04-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dr1v3 и adli82

Цитата:
Кстати эти символы относятся к управляющим, скорее всего они тебе не нужны вообще, я бы посоветовал убрать их все:  
if a[ i ]<#32 then delete(a,i,1)  

А я бы посоветовал бы делать в два прохода, первым менять все символы <#32 на пробелы, а потом непрерывную последовательность пробелов заменить одним.
Такой подход позволит не попастся на крайних ситуациях, например, когда два слова  
разделенные например парой $0D $0A, после удаления последных сольются в одно слово.
Хотя все зависит о целей и задач, поскольку при указанном подходе можно нарушить  
форматирование абзаца.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 16:42 22-04-2009
adli82



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У тебя логическая ошибка!!!
Так писать нельзя
for i:=1 to length(a) do if w[ a ]<#32 then delete(a,i,1);  
1. Надо было написать :
for i:=1 to length(a) do if w[ i ]<#32 then delete(a,i,1);  
(или может я чего-то непонял.....)
2. Всеравно не заработает. Смотри после удаления i-того символа строка стает короче и в i-той позиции уже какой-то новий символ, а ты его пропускаеш так-как i уже переходит на следующий символ. Рекомендую использовать следующий подход:

Код:
 
I:=1;
If Length(A)<>0 Then
  Repeat
    If A[ I ]<#32 Then Delete(A,I,1) Else Inc(I)
  Until I>Length(A)
 

 
Обьясню:  
  A-ето твоя строка
  I - щетчик символов
 
 
Добавлено:
V1s1ter
Тогда можно реализовать так:

Код:
 
Temp:='';
I:=1;
If Length(A)>0 Then
  Repeat
    If A[ I ]>=#32 Then Begin
                           Temp:=Temp+A[ I ];
                           Inc(I)
                         End Else Begin  
                           While I<=Length(A) Do If A[ I ]<#32 Then Inc(I) Else Break;
                           If (I<=Length(A)) Then Temp:=Temp+' '
                         End
  Until I>Length(A);
A:=Temp;
 

 
Обяснение к коду:
A - твоя строка
Temp - временная строка (тип такой-же как и A)
I - щетчик символов

Всего записей: 5 | Зарегистр. 22-04-2009 | Отправлено: 16:47 22-04-2009
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru