Listbox, вопрос..

CrazyJohn

New member
07.01.2008
4
0
#1
Значит, стоит задача разработать программу с меню на основе функции ListBox. Проблема в том, что я не догоняю как заставить программу реагировать на выбор в меню какого-либо пункта. Поэтому прошу помощи гуру программирования.

И ещё. Я так понимаю, что нужно вывести значение выбранного пункта в какую-либо переменную, в зависимости от которой прога будет выполнять желаемые действия. Но тут опять вопрос: как сделать так, чтобы прога реагировала на выбор пункта в меню на лету? То есть выбрали пункт и программа тут же делает действие, связанное с этим пунктом.

Желательно хороший пример. Заранее спасибо за помощь.
 

morpheus

скриптописец
07.08.2006
3 915
1
#2
ну обабатывайте OnClick у ListBox... это если надо обработать выбор какого либо элемента в лист боксе. А то я не совсем понял при чем тут меню?

просто пример

Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
ShowMessage( ListBox1.Items.Strings[ ListBox1.itemindex ]  );
end;
 
U

Und3rground

#3
Если я правильно понял, то ListBox должно служить меню, и в зависимости от нажатия на поле listBox, програма должна выполнять действие.

Вот пример обработчика нажатия мышкой на поле в ListBox.

Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
if (ListBox1.ItemIndex = 0) then begin // "кликнули" на первую строку
if ListBox1.Items.Strings[0] = '1' then begin
ShowMessage('Value on 1st string = 1'); // если текст первой строки "1" 
end else ShowMessage('Hello, First string!');
end;

if (ListBox1.ItemIndex = 1) then begin // "кликнули" на 2-ю строку
ListBox1.Items.Strings[1] := 'SecondString';
ShowMessage('Hello, secondString!');
end;
end;
Если я неправильно понял условие, прошу извинить. :D
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
Для: Und3rground
Минус Вашего примера в том что он статический ( для каждой строки надо писать обработчик ).сматрите мой пример выше
и вообще в таком перечислении лучше использовать ( раз уж на то пошло ) CASE - удобнее будет
 
U

Und3rground

#5
Для: Und3rground
Минус Вашего примера в том что он статический ( для каждой строки надо писать обработчик ).сматрите мой пример выше
и вообще в таком перечислении лучше использовать ( раз уж на то пошло ) CASE - удобнее будет
Да, с этим согласен. Но кто мешает заменить статические значения. :D Суть примера показать работу, а статика для этого отлично подходит. (поэтому и case не использовал)
 

CrazyJohn

New member
07.01.2008
4
0
#6
Забыл указать, что прога пишется полностью на Win API функциях. Поэтому использование компонентов исключено. Но всё равно всем спасибо. Нашёл решение, использовал case of.

Если кому-то интересно, то могу выложить код.
 

CrazyJohn

New member
07.01.2008
4
0
#7
Как-то так...

Код:
const
listbox_0=10000;
.
.
.
var
listbox: array[0..2] of hwnd;
.
.
.
function WindowProc(wnd:HWND; Msg : Integer; Wparam:integer; Lparam:integer):Lresult;
stdcall;
var
p: PChar; 
n: integer; 
s:pchar;

Begin
case msg of
wm_destroy:

Begin
postquitmessage(0); exit;
Result:=0;
End;
WM_COMMAND:
case LoWord( wParam ) of

listbox_0:
case HiWord( wParam ) of
LBN_DBLCLK: begin
n:=sendmessage(listbox[0],LB_GETCARETINDEX,0,0);
if n=0 then begin

end;
end;
end;



end;


else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;


End;
.
.
.
listbox[0] := CreateWindowEx( WS_EX_STATICEDGE, 'listbox', '', WS_VISIBLE or WS_CHILD or LBS_NOTIFY or WS_VSCROLL or WS_BORDER,
550, 265, 140, 100, EVGwnd, listbox_0, hInstance, nil );
sax_ol, вы издеваетесь или правда не знаете?
 

CrazyJohn

New member
07.01.2008
4
0
#8
Ну это стандартная функция вообще-то, чо на неё глядеть-то? :) Рисует окошко со строками. При клике мышкой по строке, она выделяется.