Суббота, 26.05.2012, 00:04

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Страница 10 из 11«12891011»
Модератор форума: Vinchensoo 
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Delphi:Вопрос-Ответ (Спросил - получил ответ)
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;


Как-то так. cool



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


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



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

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

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

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

Кстати, на счёт этого. Сегодня столкнулся с проблемой, что мне нужно было одной строкой вывести текст с переносом строк. Чтобы это реализовать - нужно использовать #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 почему-то не читает коды кнопок-стрелок... 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.02.2012, 13:44 | Сообщение # 194
старожил
Сообщений: 1591
Сейчас нет на сайте
TimKruz, я скачивал модуль Crt отдельно. Обработка нажатия других клавиш работает нормально. А вот именно со стрелками проблема sad .
Я понимаю, что можно обойтись и без стрелок, клавиш других хватает, но все-таки, может пригодиться когда-нибудь smile .

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

Набор в команду по развитию сайта 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
 
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Delphi:Вопрос-Ответ (Спросил - получил ответ)
Страница 10 из 11«12891011»
Поиск:

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