Delphi:Вопрос-Ответ
| |
RabbitNerd | Дата: Воскресенье, 25 Декабря 2011, 17:36 | Сообщение # 181 |
частый гость
Сейчас нет на сайте
| Не компилируется. Ошибка: List index out of bounds (-1) Ругается на вот эту строку: s := lst1.Items[lst1.ItemIndex];
Сообщение отредактировал RabbitNerd - Воскресенье, 25 Декабря 2011, 17:40 |
|
| |
TimKruz | Дата: Воскресенье, 25 Декабря 2011, 18:10 | Сообщение # 182 |
старожил
Сейчас нет на сайте
| 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 Декабря 2011, 18:26 |
|
| |
RabbitNerd | Дата: Воскресенье, 25 Декабря 2011, 18:30 | Сообщение # 183 |
частый гость
Сейчас нет на сайте
| TimKruz, не-а, не работает, вываливается с той же ошибкой, а ругается на строку: if listbox1.Items[listbox1.ItemIndex]='Ололошенька' then
|
|
| |
TimKruz | Дата: Воскресенье, 25 Декабря 2011, 19:33 | Сообщение # 184 |
старожил
Сейчас нет на сайте
| RabbitNerd, ну перед этим тупо проверяй значение itemindex, если не равно -1, то продолжать: Code if listbox.itemindex<>-1 then loadmemo(listbox.items.itemindex);
*Добавил:* Посмотрел я твой код (в ЛС скинул), это просто ужасно... Проверку listbox.itemindex делай в событии, например, onClick объекта listbox. Проверку combobox лучше вынеси в отдельную процедуру, т.к. ты её будешь использовать несколько раз. (в onCreate формы, в onChange самого бокса) Разве это так сложно?
Сообщение отредактировал TimKruz - Воскресенье, 25 Декабря 2011, 19:39 |
|
| |
arys | Дата: Пятница, 13 Января 2012, 00:01 | Сообщение # 185 |
почетный гость
Сейчас нет на сайте
| Всем привет! Как сделать "пойск"? У меня есть мемо,едит,батн,и лабел вводишь в едит текст - > нажимаеш на бтн - > ищет в мемо - > показывет в лабле... Мне бы кодик у меня есть идея с циклом...
500 символов не хватит, а писать начало... нету смысла без конца..
|
|
| |
LunarPixel | Дата: Пятница, 13 Января 2012, 00:23 | Сообщение # 186 |
старожил
Сейчас нет на сайте
| При нажатии на кнопку:
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;
|
|
| |
GameMix | Дата: Пятница, 03 Февраля 2012, 14:34 | Сообщение # 187 |
старожил
Сейчас нет на сайте
| Всем привет. Как реализовать в консоли обработку нажатия клавиш курсора (стрелки)?
Искал ответ в поисковиках - не нашел .
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
LunarPixel | Дата: Пятница, 03 Февраля 2012, 15:06 | Сообщение # 188 |
старожил
Сейчас нет на сайте
| GameMix, если я правильно помню, то коды клавиш такие:
#72 - вверх #77 - влево #80 - вниз #75 - вправо
И ещё, вроде, два раза нужно проверку делать, т.е. при первом нажатии спец.клавиши возвращают #0
Т.е.
Code key:=readkey; if key=#0 then key:=readkey; if key = #72 then writeln('Нажата вверх');
|
|
| |
sk0rpi0n | Дата: Пятница, 03 Февраля 2012, 15:19 | Сообщение # 189 |
Tiberium
Сейчас нет на сайте
| Кстати, на счёт этого. Сегодня столкнулся с проблемой, что мне нужно было одной строкой вывести текст с переносом строк. Чтобы это реализовать - нужно использовать #13, т.е.: Code stroka:='Первая строка'+#13+'Вторая строка'; Получится вот так при выводе: Quote Первая строка Вторая строка Мб кому пригодится...
Adventures of the Purple Ball - готов. Wanderer - готов.
|
|
| |
GameMix | Дата: Пятница, 03 Февраля 2012, 16:37 | Сообщение # 190 |
старожил
Сейчас нет на сайте
| 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 аркада. Мои статьи
Сообщение отредактировал GameMix - Пятница, 03 Февраля 2012, 16:38 |
|
| |
BASS | Дата: Пятница, 03 Февраля 2012, 16:43 | Сообщение # 191 |
independent developer
Сейчас нет на сайте
| Здравствуйте. Подскажите, пожалуйста, исходный код функции ShowMessage(в моей поставке все стандартные модули *.dcu, а тащить весь модуль Dialogs.pas ради одной функции совесть не позволяет).
Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
|
|
| |
LunarPixel | Дата: Пятница, 03 Февраля 2012, 17:00 | Сообщение # 192 |
старожил
Сейчас нет на сайте
| GameMix, опять, наверно, delphi с turbo pascal путаю ) Ибо на последнем всё работает. А делфи под рукой нет.
|
|
| |
TimKruz | Дата: Пятница, 03 Февраля 2012, 23:31 | Сообщение # 193 |
старожил
Сейчас нет на сайте
| 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 Февраля 2012, 13:44 | Сообщение # 194 |
старожил
Сейчас нет на сайте
| TimKruz, я скачивал модуль Crt отдельно. Обработка нажатия других клавиш работает нормально. А вот именно со стрелками проблема . Я понимаю, что можно обойтись и без стрелок, клавиш других хватает, но все-таки, может пригодиться когда-нибудь .
Steel Standoff - 2D аркада. Мои статьи
|
|
| | |
BASS | Дата: Суббота, 04 Февраля 2012, 14:33 | Сообщение # 196 |
independent developer
Сейчас нет на сайте
| TimKruz, спасибо+
Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
|
|
| |
GameMix | Дата: Суббота, 04 Февраля 2012, 15:23 | Сообщение # 197 |
старожил
Сейчас нет на сайте
| Quote (LunarPixel) мой способ тоже с этим новым модулем не работает? Нет, не работает. Скачал еще один Crt32. Не помогло.
Кто найдет рабочий Crt32 - сообщите.
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
TimKruz | Дата: Суббота, 04 Февраля 2012, 17:11 | Сообщение # 198 |
старожил
Сейчас нет на сайте
| 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 Февраля 2012, 17:13 |
|
| |
LunarPixel | Дата: Суббота, 04 Февраля 2012, 18:53 | Сообщение # 199 |
старожил
Сейчас нет на сайте
| 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.
Сообщение отредактировал LunarPixel - Суббота, 04 Февраля 2012, 19:05 |
|
| |
Spider_System | Дата: Суббота, 04 Февраля 2012, 18:56 | Сообщение # 200 |
Злой прогер-пьяница
Сейчас нет на сайте
| как один .exe(не дельфи), пару картинок и звуки затолкать в программу на Delphi? Внутрь, чтобы из вне открыть нельзя было. Я нашел что-то про .res-файлы, но по-моему это не совсем то, что нужно.
Маньяк. Убийца. Социопат. Анархист. Мой проект: Spider System Исходники Spider System
|
|
| |
|