| Delphi:Вопрос-Ответ |
| RabbitNerd | Дата: Воскресенье, 25.12.2011, 17:36 | Сообщение # 181 |
частый гость
Сообщений: 54
Сейчас нет на сайте
| Не компилируется. Ошибка: List index out of bounds (-1) Ругается на вот эту строку: s := lst1.Items[lst1.ItemIndex];
Сообщение отредактировал RabbitNerd - Воскресенье, 25.12.2011, 17:40 |
| |
| | |
| TimKruz | Дата: Воскресенье, 25.12.2011, 18:10 | Сообщение # 182 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| Quote (RabbitNerd) Не компилируется. Ошибка: List index out of bounds (-1) Ругается на вот эту строку: s := lst1.Items[lst1.ItemIndex]; Потому что, когда ничего не выбрано, ItemIndex=-1 (первый элемент - 0). Вместо Quote (masb8ly-GC) s := lst1.Items[lst1.ItemIndex]; if (s='Ололошенька') then begin end; Лучше Quote if lst1.Items[lst1.ItemIndex]='Ололошенька' then begin end; На счёт комбобокса: тут тоже можно использовать не text, а конструкцию типа «combobox1.Items[combobox1.ItemIndex]='...'» или ещё лучше - «case combobox1.itemindex of», чтобы не проверять варианты, введённые пользователем вручную. Quote (Stage) Сравнивать лучше по индексу. Он хочет, чтобы Quote (RabbitNerd) и ListBox приобретает Items характерные этому "Ололо" Т.е. в зависимости от combobox.itemindex будут меняться пункты listbox'а. Но, если подумать, можно и индексом (если списки жёсткие).
***Добавлено*** RabbitNerd, можешь попробовать так. В файле/константе хранится значение listbox.items (список строк типа tstings) для каждого из значений combobox. Ну а для каждой строке соответствует свой файл. При изменении значения combobox (событие onChange) пишем: Code loadlistbox(combobox.itemindex); Где loadlistbox(номер) - загружает из файла или копирует из константы содержимое listbox, предварительно очищая его содержимое процедурой clear. Например: Code procedure loadlistbox(n:byte); var i:byte; begin with form.listbox.items do begin clear; for i:=0 to 10 do add(str[n,i]); //добавляет десять пунктов listbox'а из константы-массива в соответствии с выбранным пунктом combobox'а (передаётся в n) end; end;
Далее, при нажатии на кнопку (или что-либо другое) пишем: Code loadmemo(listbox.items.itemindex); А в loadmemo(номер), как не трудно догадаться, загружаем memo: Code procedure loadmemo(n:byte); begin with form.listbox.items do begin clear; memo.text:=str[n]; //загружает соответствующую строку из константы-массива end; end;
Как-то так.
Сообщение отредактировал TimKruz - Воскресенье, 25.12.2011, 18:26 |
| |
| | |
| RabbitNerd | Дата: Воскресенье, 25.12.2011, 18:30 | Сообщение # 183 |
частый гость
Сообщений: 54
Сейчас нет на сайте
| TimKruz, не-а, не работает, вываливается с той же ошибкой, а ругается на строку: if listbox1.Items[listbox1.ItemIndex]='Ололошенька' then
|
| |
| | |
| TimKruz | Дата: Воскресенье, 25.12.2011, 19:33 | Сообщение # 184 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| RabbitNerd, ну перед этим тупо проверяй значение itemindex, если не равно -1, то продолжать: Code if listbox.itemindex<>-1 then loadmemo(listbox.items.itemindex);
*Добавил:* Посмотрел я твой код (в ЛС скинул), это просто ужасно... Проверку listbox.itemindex делай в событии, например, onClick объекта listbox. Проверку combobox лучше вынеси в отдельную процедуру, т.к. ты её будешь использовать несколько раз. (в onCreate формы, в onChange самого бокса) Разве это так сложно?
Сообщение отредактировал TimKruz - Воскресенье, 25.12.2011, 19:39 |
| |
| | |
| arys | Дата: Пятница, 13.01.2012, 00:01 | Сообщение # 185 |
почетный гость
Сообщений: 105
Сейчас нет на сайте
| Всем привет! Как сделать "пойск"? У меня есть мемо,едит,батн,и лабел вводишь в едит текст - > нажимаеш на бтн - > ищет в мемо - > показывет в лабле... Мне бы кодик у меня есть идея с циклом...
500 символов не хватит, а писать начало... нету смысла без конца..
|
| |
| | |
| LunarPixel | Дата: Пятница, 13.01.2012, 00:23 | Сообщение # 186 |
старожил
Сообщений: 2707
Сейчас нет на сайте
| При нажатии на кнопку:
Code For i:=0 to Memo1.Lines.Count do begin if pos(Edit1.Text, Memo1.Lines.Text)<>0 then begin Memo1.SelStart:=pos(Edit1.Text, Memo1.Lines.Text)-1; Memo1.SelLength:=Length(Edit1.Text); Memo1.SetFocus(); Label1.Caption:=Edit1.Text; end; end;
Набор в команду по развитию сайта GiGatun.ru
Уроки по GM от LunarPixel
Мой сайт "Лунный Пиксель"
|
| |
| | |
| GameMix | Дата: Пятница, 03.02.2012, 14:34 | Сообщение # 187 |
старожил
Сообщений: 1591
Сейчас нет на сайте
| Всем привет. Как реализовать в консоли обработку нажатия клавиш курсора (стрелки)?
Искал ответ в поисковиках - не нашел .
Steel Standoff - 2D аркада. Мои статьи MTA сервер [GCUP.RU] - RusPlay
|
| |
| | |
| LunarPixel | Дата: Пятница, 03.02.2012, 15:06 | Сообщение # 188 |
старожил
Сообщений: 2707
Сейчас нет на сайте
| GameMix, если я правильно помню, то коды клавиш такие:
#72 - вверх #77 - влево #80 - вниз #75 - вправо
И ещё, вроде, два раза нужно проверку делать, т.е. при первом нажатии спец.клавиши возвращают #0
Т.е.
Code key:=readkey; if key=#0 then key:=readkey; if key = #72 then writeln('Нажата вверх');
Набор в команду по развитию сайта GiGatun.ru
Уроки по GM от LunarPixel
Мой сайт "Лунный Пиксель"
|
| |
| | |
| sk0rpi0n | Дата: Пятница, 03.02.2012, 15:19 | Сообщение # 189 |
Tiberium
Сообщений: 478
Сейчас нет на сайте
| Кстати, на счёт этого. Сегодня столкнулся с проблемой, что мне нужно было одной строкой вывести текст с переносом строк. Чтобы это реализовать - нужно использовать #13, т.е.: Code stroka:='Первая строка'+#13+'Вторая строка'; Получится вот так при выводе: Quote Первая строка Вторая строка Мб кому пригодится...
Занимаюсь моддингом игр и программированием на Delphi/Java/Java Script.
|
| |
| | |
| GameMix | Дата: Пятница, 03.02.2012, 16:37 | Сообщение # 190 |
старожил
Сообщений: 1591
Сейчас нет на сайте
| LunarPixel, не работает. Код:Code program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Crt; var key: Char; begin while true do begin key:=readkey; if key=#0 then key:=readkey; if key = #72 then writeln('UP!'); end; end.
Steel Standoff - 2D аркада. Мои статьи MTA сервер [GCUP.RU] - RusPlay
Сообщение отредактировал GameMix - Пятница, 03.02.2012, 16:38 |
| |
| | |
| BASS | Дата: Пятница, 03.02.2012, 16:43 | Сообщение # 191 |
independent developer
Сообщений: 268
Сейчас нет на сайте
| Здравствуйте. Подскажите, пожалуйста, исходный код функции ShowMessage(в моей поставке все стандартные модули *.dcu, а тащить весь модуль Dialogs.pas ради одной функции совесть не позволяет).
Suum cuique. Jedem das Seine. Каждому своё. Ты делаешь шаг, думая, что всё останется как прежде? Ты ошибаешься. Одна только мысль о шаге меняет тебя - а значит, и твоё будущее.
|
| |
| | |
| LunarPixel | Дата: Пятница, 03.02.2012, 17:00 | Сообщение # 192 |
старожил
Сообщений: 2707
Сейчас нет на сайте
| GameMix, опять, наверно, delphi с turbo pascal путаю ) Ибо на последнем всё работает. А делфи под рукой нет.
Набор в команду по развитию сайта GiGatun.ru
Уроки по GM от LunarPixel
Мой сайт "Лунный Пиксель"
|
| |
| | |
| TimKruz | Дата: Пятница, 03.02.2012, 23:31 | Сообщение # 193 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| Quote (GameMix) LunarPixel, не работает. Код: ReadKey - это из TurboPascal функция... GameMix, попробуй модуль CRT32, там типа функции CRT-модуля из TurboPascal для консоли Delphi... Вообще, должен быть такой код: Code {$APPTYPE CONSOLE} uses CRT32; var key: Char; begin repeat key:=readkey; case key of #72: writeln('Up!'); #77: writeln('Left!'); #80: writeln('Down!'); #75: writeln('Right!'); #27: exit; //Escape end; until false; end. Однако, readkey из CRT32 почему-то не читает коды кнопок-стрелок... Может быть, если поискать, можно найти более свежую версию этого модуля...
Quote (BASS) Здравствуйте. Подскажите, пожалуйста, исходный код функции ShowMessage(в моей поставке все стандартные модули *.dcu, а тащить весь модуль Dialogs.pas ради одной функции совесть не позволяет). Вот: Code procedure ShowMessage(const Msg: string); begin ShowMessagePos(Msg, -1, -1); end; Code procedure ShowMessagePos(const Msg: string; X, Y: Integer); begin MessageDlgPos(Msg, mtCustom, [mbOK], 0, X, Y); end; Code function MessageDlgPos(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; begin Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, ''); end; Code function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; const HelpFileName: string): Integer; begin with CreateMessageDialog(Msg, DlgType, Buttons) do try HelpContext := HelpCtx; HelpFile := HelpFileName; if X >= 0 then Left := X; if Y >= 0 then Top := Y; if (Y < 0) and (X < 0) then Position := poScreenCenter; Result := ShowModal; finally Free; end; end; Code function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TForm; const mcHorzMargin = 8; mcVertMargin = 8; mcHorzSpacing = 10; mcVertSpacing = 10; mcButtonWidth = 50; mcButtonHeight = 14; mcButtonSpacing = 4; var DialogUnits: TPoint; HorzMargin, VertMargin, HorzSpacing, VertSpacing, ButtonWidth, ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, IconTextWidth, IconTextHeight, X, ALeft: Integer; B, DefaultButton, CancelButton: TMsgDlgBtn; IconID: PChar; TextRect: TRect; begin Result := TMessageForm.CreateNew(Application); with Result do begin BiDiMode := Application.BiDiMode; BorderStyle := bsDialog; Canvas.Font := Font; KeyPreview := True; OnKeyDown := TMessageForm(Result).CustomKeyDown; DialogUnits := GetAveCharSize(Canvas); HorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); VertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); HorzSpacing := MulDiv(mcHorzSpacing, DialogUnits.X, 4); VertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); ButtonWidth := MulDiv(mcButtonWidth, DialogUnits.X, 4); for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do begin if B in Buttons then begin if ButtonWidths[B] = 0 then begin TextRect := Rect(0,0,0,0); Windows.DrawText( canvas.handle, PChar(LoadResString(ButtonCaptions[B])), -1, TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); with TextRect do ButtonWidths[B] := Right - Left + 8; end; if ButtonWidths[B] > ButtonWidth then ButtonWidth := ButtonWidths[B]; end; end; ButtonHeight := MulDiv(mcButtonHeight, DialogUnits.Y, 8); ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); SetRect(TextRect, 0, 0, Screen.Width div 2, 0); DrawText(Canvas.Handle, PChar(Msg), Length(Msg)+1, TextRect, DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly); IconID := IconIDs[DlgType]; IconTextWidth := TextRect.Right; IconTextHeight := TextRect.Bottom; if IconID <> nil then begin Inc(IconTextWidth, 32 + HorzSpacing); if IconTextHeight < 32 then IconTextHeight := 32; end; ButtonCount := 0; for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do if B in Buttons then Inc(ButtonCount); ButtonGroupWidth := 0; if ButtonCount <> 0 then ButtonGroupWidth := ButtonWidth * ButtonCount + ButtonSpacing * (ButtonCount - 1); ClientWidth := Max(IconTextWidth, ButtonGroupWidth) + HorzMargin * 2; ClientHeight := IconTextHeight + ButtonHeight + VertSpacing + VertMargin * 2; Left := (Screen.Width div 2) - (Width div 2); Top := (Screen.Height div 2) - (Height div 2); if DlgType <> mtCustom then Caption := LoadResString(Captions[DlgType]) else Caption := Application.Title; if IconID <> nil then with TImage.Create(Result) do begin Name := 'Image'; Parent := Result; Picture.Icon.Handle := LoadIcon(0, IconID); SetBounds(HorzMargin, VertMargin, 32, 32); end; TMessageForm(Result).Message := TLabel.Create(Result); with TMessageForm(Result).Message do begin Name := 'Message'; Parent := Result; WordWrap := True; Caption := Msg; BoundsRect := TextRect; BiDiMode := Result.BiDiMode; ALeft := IconTextWidth - TextRect.Right + HorzMargin; if UseRightToLeftAlignment then ALeft := Result.ClientWidth - ALeft - Width; SetBounds(ALeft, VertMargin, TextRect.Right, TextRect.Bottom); end; if mbOk in Buttons then DefaultButton := mbOk else if mbYes in Buttons then DefaultButton := mbYes else DefaultButton := mbRetry; if mbCancel in Buttons then CancelButton := mbCancel else if mbNo in Buttons then CancelButton := mbNo else CancelButton := mbOk; X := (ClientWidth - ButtonGroupWidth) div 2; for B := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do if B in Buttons then with TButton.Create(Result) do begin Name := ButtonNames[B]; Parent := Result; Caption := LoadResString(ButtonCaptions[B]); ModalResult := ModalResults[B]; if B = DefaultButton then Default := True; if B = CancelButton then Cancel := True; SetBounds(X, IconTextHeight + VertMargin + VertSpacing, ButtonWidth, ButtonHeight); Inc(X, ButtonWidth + ButtonSpacing); if B = mbHelp then OnClick := TMessageForm(Result).HelpButtonClick; end; end; end; Ну и так далее... До фига всего... Вот сам модуль, всего-то 80 КБ...
|
| |
| | |
| GameMix | Дата: Суббота, 04.02.2012, 13:44 | Сообщение # 194 |
старожил
Сообщений: 1591
Сейчас нет на сайте
| TimKruz, я скачивал модуль Crt отдельно. Обработка нажатия других клавиш работает нормально. А вот именно со стрелками проблема . Я понимаю, что можно обойтись и без стрелок, клавиш других хватает, но все-таки, может пригодиться когда-нибудь .
Steel Standoff - 2D аркада. Мои статьи MTA сервер [GCUP.RU] - RusPlay
|
| |
| | |
| LunarPixel | Дата: Суббота, 04.02.2012, 13:55 | Сообщение # 195 |
старожил
Сообщений: 2707
Сейчас нет на сайте
| GameMix, мой способ тоже с этим новым модулем не работает? Просто, насколько я помню, нужно два раза считывать нажатие спец. клавиш. Или же опять это только в паскале.
Набор в команду по развитию сайта GiGatun.ru
Уроки по GM от LunarPixel
Мой сайт "Лунный Пиксель"
|
| |
| | |
| BASS | Дата: Суббота, 04.02.2012, 14:33 | Сообщение # 196 |
independent developer
Сообщений: 268
Сейчас нет на сайте
| TimKruz, спасибо+
Suum cuique. Jedem das Seine. Каждому своё. Ты делаешь шаг, думая, что всё останется как прежде? Ты ошибаешься. Одна только мысль о шаге меняет тебя - а значит, и твоё будущее.
|
| |
| | |
| GameMix | Дата: Суббота, 04.02.2012, 15:23 | Сообщение # 197 |
старожил
Сообщений: 1591
Сейчас нет на сайте
| Quote (LunarPixel) мой способ тоже с этим новым модулем не работает? Нет, не работает. Скачал еще один Crt32. Не помогло.
Кто найдет рабочий Crt32 - сообщите.
Steel Standoff - 2D аркада. Мои статьи MTA сервер [GCUP.RU] - RusPlay
|
| |
| | |
| TimKruz | Дата: Суббота, 04.02.2012, 17:11 | Сообщение # 198 |
старожил
Сообщений: 1588
Сейчас нет на сайте
| Quote (LunarPixel) Просто, насколько я помню, нужно два раза считывать нажатие спец. клавиш. Или же опять это только в паскале. Специальные клавиши - это другое. Стрелки - не специальные... Кстати, названные выше коды клавиш - это скан-коды, а вот коды в системе: Code 37 - влево 38 - вверх 39 - вправо 40 - вниз Чтение из буфера ввода консоли производится WinAPI-функцией ReadConsoleInput... Она ловит нажатие/отпускание кнопок... А ещё мыши, фокуса и ещё две каких-то штуки... Ниже код, полностью работает, сам написал. Посмотри, что и как, и сможешь легко использовать... Code {$APPTYPE CONSOLE} uses SysUtils, Windows; //Windows - модуль с WinAPI-функциями var r:Cardinal; gc:INPUT_RECORD; //Запись с данными события handle:THANDLE; //Указатель begin handle:=GetStdHandle(STD_INPUT_HANDLE); //Получаем указатель на стандартное устройство ввода repeat //Бесконечный цикл ReadConsoleInput(handle, gc, 1, r); //Читаем из устройства ввода ровно 1 запись в запись gc case gc.EventType of //Обрабатываем событие //Если сработало событие клавиатуры 1: if gc.Event.KeyEvent.bKeyDown then //...Если кнопка была НАЖАТА... Дело в том, что генерируется два события - кнопка нажата и отпущена, по-очереди... Writeln('Key: wVirtualKeyCode= '+inttostr(gc.Event.KeyEvent.wVirtualKeyCode) //Код клавиши +', wVirtualScanCode= '+inttostr(gc.Event.KeyEvent.wVirtualScanCode)); //Скан-код //Если сработало событие мыши 2: begin writeln('Mouse: X='+inttostr(gc.Event.MouseEvent.dwMousePosition.X) //X-координата +', Y='+inttostr(gc.Event.MouseEvent.dwMousePosition.Y)); //Y-координата case gc.Event.MouseEvent.dwButtonState of 0: begin end; //Ни одна кнопка мыши не нажата 1: writeln('Left mouse button pressed'); //Левая кнопка удерживается нажатой 2: writeln('Right mouse button pressed'); //Правая кнопка 4: writeln('Middle mouse button pressed'); //Средняя кнопка else writeln('Other mouse button pressed'); //У мыши может быть много кнопок end; end; //В других случаях (честно, не знаю номера событий, методом тыка подбирал) //Так что, возможно, в более сложных случаях придётся изменять этот CASE else if gc.Event.FocusEvent.bSetFocus then writeln('Have focus :)') //Если получили фокус else writeln('Lose focus :('); //И если потеряли end; until false; end. ...Правда, я что-то с мышью накрутил, что как-то странновато работает... нелогично... Впрочем, тебе же только кнопки нужны...
Сообщение отредактировал TimKruz - Суббота, 04.02.2012, 17:13 |
| |
| | |
| LunarPixel | Дата: Суббота, 04.02.2012, 18:53 | Сообщение # 199 |
старожил
Сообщений: 2707
Сейчас нет на сайте
| Quote (TimKruz) Специальные клавиши - это другое. Стрелки - не специальные... Ну да, тогда точнее сказать "на ряду со спец. клавишами"..
GameMix, попробуй вот так:
Code uses SysUtils, Windows;
begin
repeat if GetAsyncKeyState(VK_UP)<>0 then begin Writeln('PRESS UP'); while GetAsyncKeyState(VK_UP)<>0 do; end; until GetAsyncKeyState(ord('A'))<>0; readln;
end.
Набор в команду по развитию сайта GiGatun.ru
Уроки по GM от LunarPixel
Мой сайт "Лунный Пиксель"
Сообщение отредактировал LunarPixel - Суббота, 04.02.2012, 19:05 |
| |
| | |
| Spider_System | Дата: Суббота, 04.02.2012, 18:56 | Сообщение # 200 |
Злой прогер-пьяница
Сообщений: 221
Сейчас нет на сайте
| как один .exe(не дельфи), пару картинок и звуки затолкать в программу на Delphi? Внутрь, чтобы из вне открыть нельзя было. Я нашел что-то про .res-файлы, но по-моему это не совсем то, что нужно.
Маньяк. Убийца. Социопат. Анархист. Мой проект: Spider System Исходники Spider System
|
| |
| |
|