Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Измение текста static контрола [D7, WinXP]


Денис178 ©   (2007-06-26 02:02:00) 

Собирал ресурс:

MAIN_WINDOW DIALOGEX 32768, 0, 258, 130
STYLE DS_MODALFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
CAPTION "Еуые"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 8, "MS SANS SERIF"
{
CONTROL "lalala", 3, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 8, 100, 90
}

А как из программы обратиться к этому контролу не знаю. Нужно всего лишь поменять текст надписи. Подскажите пож кто занет.


Денис178   (2007-07-07 23:35:00) [1]

мда.. загадочное явление


Dib@zol   (2007-07-07 20:43:00) [2]

Хм. Возможно дело в компиляторе. У меня например, если в обработчике какого-то сообщения реализован цикл, то прога (даже если это сообщение ей нифжисть не слали) просто виснет намертво. Если же цикл выносится в отдельную процедуру, то всё идёт пучком. Как видно, это из той же оперы.


Денис178   (2007-07-07 19:15:00) [3]

остался спортивный интерес:)

ПОЧЕМУ ТАК ПРОИСХОДИТ??


Денис178   (2007-07-07 19:14:00) [4]

> Dib@zol
SendDlgItemMessage(HWin, i, WM_DESTROY, 0, 0); вот это не убило мою метку, что очень странно.. и вообще ничего убило. там в ресурсе ещё кнопка есть

> Ты как находишь хендл диалога-родителя?
ну вызывается же оконная функция DlgProc в которой hWin как я понимаю и есть хендл родителя. вот код:


function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
 Cntrl:hWnd;
 i:integer;
 s:pchar;
begin
Result := 0;
 case uMsg of
  WM_INITDIALOG:
   Begin
    SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, 'MAINICON'));
   end;
  WM_COMMAND:
   begin
    case LoWord(wParam) of
     1: EndDialog(hWin, 0);
     2: begin
          SetDlgItemText(hWin, 4, 'aaa');

          FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
               nil, getlasterror, 0, @s, 0, nil);

          ShowMessage(s);

        end;

   end;
 end;
  WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;

begin
{$R shell_new.res}
DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);
end.


а теперь самое интересное, странное, но работающее..



function chlabel(hWin:integer):integer;
begin
SetDlgItemText(hWin, 4, 'aaa');
end;

function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
 Cntrl:hWnd;
 i:integer;
 s:pchar;
begin
Result := 0;
 case uMsg of
  WM_INITDIALOG:
   Begin
    SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, 'MAINICON'));
   end;
  WM_COMMAND:
   begin
    case LoWord(wParam) of
     1: EndDialog(hWin, 0);
     2: chlabel(hWin);
   end;
 end;
  WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;

begin
{$R shell_new.res}
DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);
end.


этот код меняет текст мекти, предидущий НЕТ, почему так происходит мыслей тоже нет..


Однокамушкин   (2007-07-07 09:11:00) [5]


> Денис178   (06.07.07 18:20) [8]
> Или может как то можно продиагностировать почему эта фнукция
> не сработала?

Анализировать возвращаемый результат, вызывать GetLastError...


Денис178   (2007-07-06 18:20:00) [6]

Не то чтобы получилось, просто вспомнил что когда то пользовался этим, но забыл что это диалоговое окно, а тут немного по другому. контрол создаётся с тем текстом который описал в ресурсе. а вот менять текст не позволяет. Может можно как нибудь в диалоговом окне просто пройтись по всем контролам, найти нужный лэйбл, и обычным способом поменять заголовок? Или может как то можно продиагностировать почему эта фнукция не сработала?


clickmaker   (2007-07-06 17:35:00) [7]


>  [2] Денис178   (27.06.07 17:35)
> Благодарю! Получилось
>
>  [3] Денис178   (05.07.07 21:10)
> Нет, не получилось..

хм... то есть все-таки один раз получилось?
сам контрол-то хоть создается?


Dib@zol   (2007-07-06 17:20:00) [8]

Странно... Мож попробуешь так:

for i:=1 to 100 do // границы проверки выбирай сам
 SendDlgItemMessage(HWin, i, WM_DESTROY, 0, 0);

и запускай в режиме отладки. На каком проходе цикла метка удалится - тот и идентификатор. Как видно, он явно не 3.

Или другой вариант. Ты как находишь хендл диалога-родителя? Засвети код. Очвозможно что ты там накосячил.


Денис178   (2007-07-06 17:10:00) [9]

Не помогает.. Стыдно, эелементарная вещь, а чё с ней делать не знаю. Уже лет 5 делфю не трогал, забыл всё напрочь.


Dib@zol   (2007-07-06 13:18:00) [10]


> SetWindowText(Cntrl,'Hello');


SetDlgItemText(HWin, 3, 'Твой_текст');


Денис178   (2007-07-05 21:10:00) [11]

Нет, не получилось.. Посмотрите пожалуйста, что не так делаю

program shell;

uses
Windows, Messages, WinSock, SysUtils;

function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
 Cntrl:hWnd;
begin
Result := 0;
 case uMsg of
  WM_INITDIALOG:
   Begin
    SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, 'MAINICON'));
   end;
  WM_COMMAND:
   begin
    case LoWord(wParam) of
     1: EndDialog(hWin, 0);
     2: begin
          Cntrl:=GetDlgItem(hWin,3);
          SetWindowText(Cntrl,'Hello');
        end;

   end;
 end;
  WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;

begin
{$R shell.res}
DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);
end.

В функции GetDlgItem второй параметр
int nIDDlgItem  // identifier of control
этот тот порядковый идентификатор который я указываю в ресурсе?

Спасибо


Денис178   (2007-06-27 17:35:00) [12]

Благодарю! Получилось


Однокамушкин   (2007-06-26 08:56:00) [13]

Получите хэндл контрола через функцию GetDlgItem, а потом SetWindowText...


Наверх

Титульная страница Поиск, карта сайта Написать письмо