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

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

SetDlgItemText [D1, D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


g-l-u-k ©   (2005-06-13 00:50:00) 

Доброго дня или ночи товарищи программисты!
Мой вопрос в следующем,я пиши программу которая в качестве формы использует окна из ресурсов,всё работает нормально,только мне нужно что бы в одном из окон в memo контроле был отображён текоторый текст,в несколько строк.Я пробовал использовать ф-цию SetDlgItemText но ничего не вышло я делаю так:


const
NFO_EDIT   = 106;
info       = 'Некоторый текст'+#13#10+
            '...............';

.................................

function AboutDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
var
 OldInfo : array[0..65534] of Char;
 hWnd    : integer;
begin
 Result  := 0;
 if (uMsg = WM_DESTROY) or  (uMsg   = WM_CLOSE) or
   ((uMsg = WM_COMMAND) and (wParam = ABOUT_CLOSE_BUTTON))
 then EndDialog(hWin,0);
   GetDlgItemText(hWnd, INFO_EDIT, PChar(@OldInfo), 65535);
   SetDlgItemText(hWnd, INFO_EDIT, PChar(String(OldInfo) + info));
end;

...............................

а вызываю я это окно так:
if wParam = ID_ABOUT then DialogBoxParam(Inst, PChar(ABOUT_DIALOG), Win,@AboutDlgProc, 0);


Но в результате текст не выводится,в чём ошибка я не понимаю,помогите пожалуйста.


String   (2005-06-14 02:16:00) [1]

>>g-l-u-k ©   (13.06.05 14:14) [3]
>Это делпть при инициализации главного окна?

нет, в функции AboutDlgProc
if uMsg = WM_INITDIALOG then
begin
 GetDlgItemText(hWin, INFO_EDIT, PChar(@OldInfo), 65535);
 SetDlgItemText(hWin, INFO_EDIT, PChar(String(OldInfo) + info));
end;

а вообще такие вещи обычно через Case реализуют.

ошибка возможно от того, что твоя функция объявлена не правильно
должно быть:
function OptionsDlgProc(hDlg: HWND; iMsg: integer; wParam, lParam: integer): boolean; stdcall;
begin
 Case iMsg of
   WM_INITDIALOG :
   begin
     Result := true;
     Exit;
   end;
   WM_DESTROY: ...
end;

заметь hWin (hDlg) имеет тип HWND, а сама функция BOOLEAN
если Result принимает значение true - это означает, что ты обработал сообщение, если false - запустится обработка по умолчанию


VMcL   (2005-06-13 18:50:00) [2]

>> g-l-u-k ©   (13.06.05 14:14) [3]

> Но теперь после компиляции, при попытке вызвать данное окно программа выдаёт ошибку.

Какую ошибку выдаёт программа, предстоит угадать?


g-l-u-k   (2005-06-13 14:14:00) [3]

Сделал я теперь так:

function AboutDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
var
 OldInfo : array[0..65534] of Char;
begin
 Result  := 0;
 if (uMsg = WM_DESTROY) or  (uMsg   = WM_CLOSE) or
   ((uMsg = WM_COMMAND) and (wParam = ABOUT_CLOSE_BUTTON))
 then EndDialog(hWin,0);
    OldInfo[0]:='0';
    GetDlgItemText(hWin, INFO_EDIT, PChar(@OldInfo), 65535);
    SetDlgItemText(hWin, INFO_EDIT, PChar(String(OldInfo) + info));
end;

Но теперь после компиляции, при попытке вызвать данное окно программа выдаёт ошибку.


> Функцию установки текста вызывай при uMsg = WM_INITDIALOG,
> а не при любом событии.


Это делпть при инициализации главного окна?


VMcL   (2005-06-13 10:23:00) [4]

>> g-l-u-k ©   (13.06.05 00:50)

> GetDlgItemText(hWnd, INFO_EDIT, PChar(@OldInfo), 65535);
  SetDlgItemText(hWnd, INFO_EDIT, PChar(String(OldInfo) + info));


И чему же здесь равно hWnd, позвольте узнать?


String   (2005-06-13 03:25:00) [5]

Функцию установки текста вызывай при uMsg = WM_INITDIALOG, а не при любом событии.
Перед GetDlgItemText() обнули OldInfo, иначе он может некорректно к String-у преобразоваться.
!!! а не работает это все потому, что в функцию SetDlgItemText() hWin передается, а не hWnd


Наверх

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