Listbox, вопрос..

  • Автор темы CrazyJohn
  • Дата начала
C

CrazyJohn

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

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

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

morpheus

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

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

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

Und3rground

Если я правильно понял, то 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
 
M

morpheus

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

Und3rground

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

Да, с этим согласен. Но кто мешает заменить статические значения. :D Суть примера показать работу, а статика для этого отлично подходит. (поэтому и case не использовал)
 
C

CrazyJohn

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

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

CrazyJohn

Как-то так...

Код:
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, вы издеваетесь или правда не знаете?
 
C

CrazyJohn

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!