• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Delphi & TurboPascal.

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
  • Первое сообщение
  • #1
В этой теме предлагаю задавать вопросы по Дельфи и Паскалю. Хотел сперва одну тему создать на все языки, т.к. не данный раздел не пользуется популярностью, но заметил тему о C++.

----

Я начал писать программку, первую самостоятельно, без какой-либо помощи в кодерстве, дизайне или идеях. Достаточно сложно, но я уверен, что это просто сначала так.

И вот какие у меня появились вопросы:
1.Как ставить разделители в меню? Ну, полоски такие, серые. В любой менюшке есть разделения, типа: отменить *разделитель*, вставить-вырезать-копировать. Как их вставить-то?
2.По умолчанию, на форме присутствуют 3 кнопочки в верхнем правом углу: свернуть, развернуть, закрыть. Как убрать 2 кнопки и оставить только "закрыть"?
3.Как запретить изменение размера окна?

Язык - Delphi 2007.
 
Последнее редактирование модератором:

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
В KeyDown сама Key: Word. А мне Char надо. Что ж мне, только цифры на клавиатуре нажимать.

Добавил:
Может другой обработчик, попробуй другие..или может в свойствах есть что-то вроде HotKey с возможностью декларативно задать кнопку и привязать к ней действие
Через Edit1KeyPress все прекрасно работает. Но хотелось бы чтоб сразу все работало, а не после того, как кликнул на окошко Едит.
Никаких Хоткеев на форме не нашел.
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Хруст, там же написано, что обработчик активизируется при нажатии любой клавиши. Тип word и должен быть как я понял из прочитанного, т.к. можно задавать коды клавиш в целочисленном виде. Таблица значений по клавишам здесь http://www.realcoding.net/article/view/1857 .
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Параметры:

Все события имеют один общий параметр, обычно называемый Key. Этот параметр используется для передачи кода нажатой клавиши. Параметр Shift (в процедурах OnKeyDown и OnKeyUp), указывает на то, была ли нажата клавиша в сочетании с Shift, Alt, и Ctrl.

здесь подробнее
http://sources.ru/delphi/system/keyboard_symphony.shtml

думаю теперь мы оба поняли что к чему :D
 

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
Только хотел написать, что все равно ниче не работает, как взгялд упал на самый конец статьи "Симфония на клавиатуре", на строчку"Если один из компонентов Edit имеет фокус и свойство KeyPreview установлено в False, то этот код не будет выполнен - другими словами, если пользователь нажмёт клавишу '5', то в компоненте Edit, имеющем фокус, появится символ "5"."
Выставил"Тру"шное значение, все норм работает. Спасибо. :)
 
Последнее редактирование модератором:

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
Эй, че за фигня. Едит убрал, который теперь, как я подумал, не нужен. Перестало работать. Эт че, мне терь без едита никуда?
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Xpycm написал(а):
Эй, че за фигня. Едит убрал, который теперь, как я подумал, не нужен. Перестало работать. Эт че, мне терь без едита никуда?
Код выложи, а то гадать будем час :)
 
Последнее редактирование модератором:

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
У меня там был скрытый мемо, так я его открыл, а едит убрал. Без чего-нибудь не хочет работать никак.
Ладно, я преподу скажу, что эт я дизайн такой хочу, а не то, что у меня без окна мемо ниче не работает.

Код выложи, а то гадать будем час
Выложу все уж :)
Задание:
Калейдоскоп представляет собой правильный N-угольник, разделенный на N правильных треугольников. Пользователь выбирает один из треугольников и с помощью датчика случайных чисел этот треугольник рассекается M прямыми. Каждая из полученных частей треугольника закрашивается цветом, выбранным случайным образом. После этого изображение в каждом следующем треугольнике (по часовой стрелке) получается симметричным отображением относительно общей стороны обоих треугольников.
Технические требования: Значение N(4,6,8) и M М(2≤M≤6) хранится в файле Input.txt. Калейдоскоп располагается в центре экрана и в начальном состоянии все треугольники черные.
Управление игрой осуществляется с помощью клавиатуры. Предусмотреть возможность очистки калейдоскопа и записи полученных цветов в файл Output.txt.
Реализовано не все. Только вот это:
1. Рисует n-угольник и делит его на n правильных треугольников на основе Input.txt.
2. Выбор треугольника с клавиатуры. (стрелками)

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
procedure kvadrat;
procedure shestiugolnik;
procedure vosmiugolnik;
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure klavKvadrat(var Key: Word);
procedure klavShest(var Key: Word);
procedure klavVosm(var key:Word);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1; var a,b:integer; n,m,c,l:byte;

implementation

{$R *.dfm}

procedure TForm1.kvadrat;
begin
canvas.brush.color:=clBlack;
a:=(form1.Width div 2)-150;
b:=(Form1.height div 2)-150;
canvas.polygon([point(a+300,b),point(a+300,b+300),point(a,b+300),
point(a,b)]);
canvas.moveto(a,b);
canvas.LineTo(a+300,b+300);
canvas.MoveTo(a+300,b);
canvas.LineTo(a,b+300);
end;

procedure TForm1.shestiugolnik;
begin
canvas.brush.color:=clBlack;
a:=(form1.Width div 2)-150;
b:=(Form1.height div 2)-150;
canvas.polygon([point(a,b),point(a+150,b-150),point(a+300,b),
point(a+300,b+300),point(a+150,b+450),point(a,b+300)]);
canvas.MoveTo(a,b);
canvas.LineTo(a+300,b+300);
canvas.moveto(a+300,b);
canvas.lineto(a,b+300);
canvas.moveto(a+150,b-150);
canvas.lineto(a+150,b+450);
end;

procedure tform1.vosmiugolnik;
begin
canvas.brush.color:=clBlack;
a:=(form1.Width div 2);
b:=(Form1.height div 2);
canvas.polygon([point(a-75,b-150),point(a+75,b-150),point(a+150,b-75),
point(a+150,b+75),point(a+75,b+150),point(a-75,b+150),
point(a-150,b+75),point(a-150,b-75)]);
canvas.moveto(a-150,b+75);
canvas.lineto(a+150,b-75); //delim na zapchasti
canvas.moveto(a-150,b-75);
canvas.lineto(a+150,b+75);
canvas.moveto(a-75,b-150);
canvas.lineto(a+75,b+150);
canvas.moveto(a+75,b-150);
canvas.lineto(a-75,b+150);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.pen.Width:=2;
canvas.Pen.color:=clwhite;
canvas.brush.color:=clBlack;
case n of
4: kvadrat;
6: shestiugolnik;
8: vosmiugolnik;
else showmessage('Некорректные данные в Input.txt');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.loadfromfile('input.txt');
n:=strtoint(memo1.lines[0]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
m:=0;
l:=0;
canvas.pen.Width:=2;
canvas.Pen.color:=clwhite;
canvas.brush.color:=clBlack;
case n of
4: kvadrat;
6: shestiugolnik;
8: vosmiugolnik;
else showmessage('Некорректные данные в Input.txt');
end;
end;

procedure tform1.klavkvadrat(var Key: Word);
begin
kvadrat;
canvas.brush.color:=clLime;
case key of
38: canvas.polygon([point(a,b),point(a+300,b),point(a+150,b+150)]); //вверх
40: canvas.polygon([point(a,b+300),point(a+300,b+300),point(a+150,b+150)]); //вниз
37: canvas.polygon([point(a,b),point(a,b+300),point(a+150,b+150)]); //влево
39: canvas.polygon([point(a+300,b),point(a+300,b+300),point(a+150,b+150)]); //вправо
end;
end;

procedure tform1.klavShest(var Key: Word);
begin
shestiugolnik; //m - позиция треугольника по высоте
canvas.brush.color:=clLime; //l - позиция по горизонтали
case key of
38: if m>1 then m:=m-1 else m:=1; //вверх
40: if m<2 then m:=m+1 else m:=3; //вниз
37: l:=2; //влево
39: l:=1; //вправо
// else key:=#6;
end;
if l=1
then
case m of
1: canvas.polygon([point(a+150,b-150),point(a+300,b),point(a+150,b+150)]);
2: canvas.polygon([point(a+300,b),point(a+300,b+300),point(a+150,b+150)]);
3: canvas.polygon([point(a+300,b+300),point(a+150,b+450),point(a+150,b+150)]);
end
else
case m of
1: canvas.polygon([point(a,b),point(a+150,b-150),point(a+150,b+150)]);
2: canvas.polygon([point(a,b),point(a+150,b+150),point(a,b+300)]);
3: canvas.polygon([point(a,b+300),point(a+150,b+150),point(a+150,b+450)]);
end;
end;
procedure tform1.klavVosm(var key:Word);
begin
vosmiugolnik;
canvas.brush.color:=clLime;
// canvas.polygon([point(a-75,b-150),point(a+75,b-150),point(a+150,b-75),
// point(a+150,b+75),point(a+75,b+150),point(a-75,b+150),
// point(a-150,b+75),point(a-150,b-75)]);
case key of
38: if m>1 then m:=m-1 else m:=8; //вверх
40: if m<8 then m:=m+1 else m:=1; //вниз
end;
case m of
1: canvas.polygon([point(a,b),point(a-75,b-150),point(a+75,b-150)]);
2: canvas.polygon([point(a,b),point(a+75,b-150),point(a+150,b-75)]);
3: canvas.polygon([point(a,b),point(a+150,b-75),point(a+150,b+75)]);
4: canvas.polygon([point(a,b),point(a+150,b+75),point(a+75,b+150)]);
5: canvas.polygon([point(a,b),point(a+75,b+150),point(a-75,b+150)]);
6: canvas.polygon([point(a,b),point(a-75,b+150),point(a-150,b+75)]);
7: canvas.polygon([point(a,b),point(a-150,b+75),point(a-150,b-75)]);
8: canvas.polygon([point(a,b),point(a-150,b-75),point(a-75,b-150)]);
end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case n of
4: klavkvadrat(key);
6: klavShest(key);
8: klavVosm(key);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.lines.savetofile('input.txt');
end;

end.
 
Последнее редактирование модератором:

siryksv

Участник форума
Регистрация
5 Окт 2009
Сообщения
567
Благодарности
1
Баллы
225
Xpycm
Установите свойство TabStop в false для всех кнопок на форме. Будет работать и со скрытым Memo.
 

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
siryksv
О, спасибо. Терь все хорошо работает :) Можно первоначальный дизайн ставить.

А за что этот TabStop отвечает? В двух словах.
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Код:
Form1.KeyPreview=true
Ты его ставил для edit, ведь так? Поставь для формы и все заработает без эдитов, мемо и.т.п.

По способу siryksv: цитата из той же статьи
Если один из компонентов Edit имеет фокус и свойство KeyPreview установлено в False. Этого нужно избежать
siryksv
черт, опередил
 

siryksv

Участник форума
Регистрация
5 Окт 2009
Сообщения
567
Благодарности
1
Баллы
225
Xpycm
Свойство TabStop определяет, может ли компонент получать фокус, если пользователь нажимает клавишу Tab, так как при нажатии Таба фокус переходит от одного компонента к другому; порядок, в котором будет передаваться фокус, определяется свойством TabOrder.
xterm
Да ладно уж... :p Не надо обижаться *flowers*. Кстати говоря, xterm, раздел о программировании и в частности о Дельфи сам по себе интересный, но почему-то слишком вялый - ну, в смысле, мало сообщений и вовлеченных пользователей :'(. Как бы это исправить ???

просьбочка
Предложения и замечания по наполнению и редактированию раздела пишите пожалуйста в соответствующей теме, для чего-то я ведь её создавал::) Или используйте ЛС. Заранее спасибо;)
 

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
Ты его ставил для edit, ведь так?
Нет, кейпревью ставил для формы сразу. В Едит и так все работало.
Поставь для формы и все заработает без эдитов, мемо и.т.п.
Неа, не заработает. Но мемо мне по-любому там нужно, поэтому нестрашно.
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Xpycm написал(а):
Ты его ставил для edit, ведь так?
Нет, кейпревью ставил для формы сразу. В Едит и так все работало.
Значит при поставленном для формы на ней еще присутствовал edit с фокусом ??? Косяк мог быть из-за него, проверь, интересно просто :)
Xpycm написал(а):
Неа, не заработает. Но мемо мне по-любому там нужно, поэтому нестрашно.
Эт понятно, но лучше бы разобраться, чем ставить visible:=false или делать вид что так и должно быть :D
 
Последнее редактирование модератором:

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
Проверил, убрал мемо. Да, и без него работает. Что-т странно :). Ну да ладно.
Всем спасибо.
 

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295
Как сделать так, чтобы по нажатию клавиши выполнялось какое-либо действие? Только поподробнее.
Проще сделать, чтобы прога отлавливала любой активный процесс (он всегда есть). И уже через него действовать… это делается через API команды, Delphi я не очень знаком, я больше по C++, но разница не большая… минус… может реагировать антивирус, на такую прогу… я однажды много труда вложил, чтобы побороть антивирус, а потом в конце, его совсем заблочить... но это хакерство :)

Edit:
Млин... я сперва не понял... второй страницы не видел ::)
Подумал надо выполнять действие при скрытой программе :)
 

xterm

Участник форума
Регистрация
25 Июн 2009
Сообщения
5.178
Благодарности
16
Баллы
400
Geor'G, не проще. Имхо Win API извращение ;) Тем паче хуки :) Хотя иногда без него никуда..

Edit(c) Geor'G
Не видел что ты сначала не видел условие :D В том случае больше и варианта не было другого
 

GeorG

Участник форума
Регистрация
27 Авг 2008
Сообщения
3.447
Благодарности
11
Баллы
295

siryksv

Участник форума
Регистрация
5 Окт 2009
Сообщения
567
Благодарности
1
Баллы
225
WinApi ничуть не извращение. Конечно, большую программу написать сложно, зато мелкие утилиты получаются на ура! :) Делфи позволяет создавать проги без VCL, а на чистом WinApi, и размер чистой (пустой) проги будет около 10 Кб.

Теперь по теме перехвата нажатия клавиш. Тут, как я понял, шла речь об хуках. Так вот, имхо, использовать хук накладно, так как придется еще писать вспомогательную DLL-библиотеку. Проще использовать WinApi функцию RegisterHotKey, а потом отлавливать событие WM_HOTKEY в обработчике оконных сообщений. Позволяет ловить сообщения, даже когда ваша программа не активна (т.е. результат будет практически аналогичен использованию хука).

З.Ы. Если кому-то станет интересен этот способ, постараюсь описать подробно.
 

Xpycm

Участник форума
Регистрация
6 Янв 2008
Сообщения
2.257
Благодарности
25
Баллы
245
Так, добил я ту прогу, думаю надо сюда выложить.
Вот задание - http://forum.worldofplayers.ru/showpost.php?p=266616&postcount=27
Не буду переписывать. Теперь реализовано все, только вот с восьмиугольником не совсем правильно. Неправильно он раскрашивается, но мне уже лень этим заниматься. Там надо координаты выщитывать, условия всякие. Не хочу, очень много времени уходит.
Калейдоскоп.рар - собсно прога.
Калейдоскоп_сырцы.рар - исходники.

xterm
Если надо, продублируй в "я создал программу". У меня седня с инетом проблемы.
 

Вложения

  • Калейдоскоп.rar
    169 KB · Просмотры: 154
  • Калейдоскоп_сырцы.rar
    16,7 KB · Просмотры: 164

vmazz

Участник форума
Регистрация
18 Дек 2008
Сообщения
218
Благодарности
1
Баллы
165
Вот и наткнулся я на запарку. Кароче не буду тут строчить громадные обьяснения, вопрос такой как из ини-файла такого содержания
Код:
[IT_Addon_Shells.d]
ItMi_Addon_Shell_01=Створчатый моллюск
ItMi_Addon_Shell_02=Спиральный моллюск
[IT_FakeScroll.d]
Fakescroll=Письмо
[IT_Torch.d]
ItLsTorch=Факел
ItLsTorchburning=Горящий факел
ItLsTorchburned=Факел
ItLsTorchFirespit=Факел
заполнить TreeView чтоб он выглядел так (скрин во вложении)

или хотябы примерно так:
IT_Addon_Shells.d
|
+---ItMi_Addon_Shell_01=Створчатый моллюск
+---ItMi_Addon_Shell_02=Спиральный моллюск
а с работой со строками я уже разберусь, там есть опыт.

В идеале мне бы функцию.... =)
 

Вложения

  • tree.JPG
    tree.JPG
    7,6 KB · Просмотры: 369
Сверху Снизу