Текущий архив: 2002.07.15;
Скачать: CL | DM;
ВнизТекст меню по идентификатору Найти похожие ветки
← →
anod (2002-05-09 23:56) [0]for i:= 0 to length(IDM_N)-1 do begin
if wParam = IDM_N[i] then begin
szString:="FAIL";
GetMenuString(PopUpMenu, IDM_N[i], szString, 0, MF_BYPOSITION);
MessageBox(0,szString, nil ,MB_OK);
end;
Выдает в сообщении FAIL, почему?
← →
anod (2002-05-10 17:23) [1]Гуляют ещё люди чтоль?
Помогите.
← →
Song (2002-05-10 18:29) [2]А что за сообщение? Чему равен WParam?
← →
anod (2002-05-10 23:00) [3]
case Msg of
WM_COMMAND:
begin
{...приведенный выше код...}
case wParam of
IDM_EXIT: SendMessage(MainWND,WM_CLOSE,0,0);
end;
end;
end;
Вот, в кратком виде код.
А здесь, как задается IDM_N:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1020889117&n=5
← →
фтщв (2002-05-11 11:12) [4]Люди, помогите, плизззз.
← →
Song (2002-05-11 11:22) [5]А какой тип szString?
← →
Cobalt (2002-05-11 13:02) [6]
>GetMenuString(PopUpMenu, IDM_N[i], szString, 0 , MF_BYPOSITION);
А этот 0 не является, случаем, размером строки?
Еще, желательно, устанавливать размер строкиSetLength(szString, 255);
← →
Atrem (2002-05-11 15:20) [7]попробуй вот так, у меня вроде пашет
Здесь при выбору пункта главного или системного меню формы показывается его срочка в Caption формы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N11: TMenuItem;
N21: TMenuItem;
das1: TMenuItem;
gfsgdf1: TMenuItem;
private
{ Private declarations }
public
procedure wm(var msg:TWMCommand);message wm_command;
procedure wms(var msg:TWMSysCommand);message wm_syscommand;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.wms(var msg:TWMSysCommand);
var a:array[0..255] of char;
h:HMENU;
begin
h:=GetSystemMenu(Handle,false);
GetMenuString(h,msg.CmdType,a,256,MF_BYCOMMAND);
Caption:=string(a);
inherited;
end;
procedure TForm1.wm(var msg:TWMCommand);
var a:array[0..255] of char;
h:HMENU;
begin
if msg.NotifyCode=0 then
begin
h:=getmenu(Handle);
GetMenuString(h,msg.ItemID,a,256,MF_BYCOMMAND);
Caption:=string(a);
end;
inherited;
end;
end.
← →
anod (2002-05-11 15:34) [8]2Song
szString : PCHAR;
2Cobalt
В хелпе написано, что если 0, то вроде бы просто возвращяется вся строка?
← →
Cobalt (2002-05-11 16:01) [9]int GetMenuString(
HMENU hMenu, // handle to the menu
UINT uIDItem, // menu item identifier
LPTSTR lpString, // buffer for the string
int nMaxCount, // maximum length of string
UINT uFlag // options
);
Parameters
hMenu
[in] Handle to the menu.
uIDItem
[in] Specifies the menu item to be changed, as determined by the uFlag parameter.
lpString
[out] Pointer to the buffer that receives the null-terminated string. If the string is as long or longer than lpString, the string is truncated and the NULL terminator is added.
If lpString is NULL, the function returns the length of the menu string.
nMaxCount
[in] Specifies the maximum length, in characters, of the string to be copied. If the string is longer than the maximum specified in the nMaxCount parameter, the extra characters are truncated.
If nMaxCount is 0, the (Result of) function returns the length of the menu string.
If the function succeeds, the return value specifies the number of characters copied to the buffer, not including the terminating null character.
If the function fails, the return value is zero.
То есть есть 2 пути получения:
1) передаем ей Nil-строку, получаем длину, устанавливаем длину строки, опять вызываем функцию с "правильными" длинами, должно быть все ОК.
2) ставим длину строки довольно большой величиной (напр. 255), и мучаемся только в случае если возвращается 0. (В первую очередь смотримShowMessage(SysErrorMessage(GetLastError)))
, ну а дальше по обстоятельствам.
← →
anod (2002-05-11 21:19) [10]НЭто дело не в строке, убирал я вообще этот цикл - Аксес Виолатион, вставил, теперь при выборе меню, а паньше этого вообще не было, если не лень посмотрите код, я не понимаю. Первая программа на Апи и облом.
http://anodprogs.narod.ru/cds.rar (8kb)
← →
anod (2002-05-11 22:32) [11]Исправил ошибку с переменными вроде заработала сама программа, но, здесь опять выдает ACCESS VIOLATION:
for i:= 0 to Length(IDM_N)-1 do begin
if wParam = IDM_N[i] then begin
sel:=GetMenuString(PopUpMenu,IDM_N[i],szStr, 0, MF_BYCOMMAND);
GetMenuString(PopUpMenu,IDM_N[i], szStr, sel, MF_BYCOMMAND);
MessageBox(0, szStr, "Message", MB_OK);
end;
end;
Пытался просто ставить 255, не идет, а SetLength для PCHAR не работает :(
← →
anod (2002-05-11 22:38) [12]array[0..255] of char;
Вот так заработала, а раньше писала , что-то типа нужен pchar, а не array :)
← →
Cobalt (2002-05-11 22:45) [13]Делай просто преобразование типа
var s:string;
...PChar(s)...
← →
anod (2002-05-12 00:37) [14]По-моему все-таки где-то есть ошибка глобальная в программе, т.к. ACCESS VIOLATION появляется иногда в самых неожиданных местах.
Страницы: 1 вся ветка
Текущий архив: 2002.07.15;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.013 c