Пятница, 22 Ноября 2024, 21:47

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
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;


Как-то так. cool




Сообщение отредактировал 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);


*Добавил:*
Посмотрел я твой код (в ЛС скинул), это просто ужасно... facepalm
Проверку listbox.itemindex делай в событии, например, onClick объекта listbox.
Проверку combobox лучше вынеси в отдельную процедуру, т.к. ты её будешь использовать несколько раз. (в onCreate формы, в onChange самого бокса)
Разве это так сложно?




Сообщение отредактировал TimKruz - Воскресенье, 25 Декабря 2011, 19:39
arysДата: Пятница, 13 Января 2012, 00:01 | Сообщение # 185
почетный гость
Сейчас нет на сайте
Всем привет!
Как сделать "пойск"?
У меня есть мемо,едит,батн,и лабел вводишь в едит текст - > нажимаеш на бтн - > ищет в мемо - > показывет в лабле...
Мне бы кодик hands у меня есть идея с циклом...


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
старожил
Сейчас нет на сайте
Всем привет.
Как реализовать в консоли обработку нажатия клавиш курсора (стрелки)?

Искал ответ в поисковиках - не нашел sad .


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
Сейчас нет на сайте
Quote
#число или цифра

Кстати, на счёт этого. Сегодня столкнулся с проблемой, что мне нужно было одной строкой вывести текст с переносом строк. Чтобы это реализовать - нужно использовать #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 почему-то не читает коды кнопок-стрелок... sad Может быть, если поискать, можно найти более свежую версию этого модуля...

Quote (BASS)
Здравствуйте. Подскажите, пожалуйста, исходный код функции ShowMessage(в моей поставке все стандартные модули *.dcu, а тащить весь модуль Dialogs.pas ради одной функции совесть не позволяет).

Вот: biggrin
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;

wacko Ну и так далее... До фига всего... Вот сам модуль, всего-то 80 КБ...


GameMixДата: Суббота, 04 Февраля 2012, 13:44 | Сообщение # 194
старожил
Сейчас нет на сайте
TimKruz, я скачивал модуль Crt отдельно. Обработка нажатия других клавиш работает нормально. А вот именно со стрелками проблема sad .
Я понимаю, что можно обойтись и без стрелок, клавиш других хватает, но все-таки, может пригодиться когда-нибудь smile .


Steel Standoff - 2D аркада.
Мои статьи
LunarPixelДата: Суббота, 04 Февраля 2012, 13:55 | Сообщение # 195
старожил
Сейчас нет на сайте
GameMix, мой способ тоже с этим новым модулем не работает? smile
Просто, насколько я помню, нужно два раза считывать нажатие спец. клавиш. Или же опять это только в паскале. smile


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
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг