Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 212»
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Ребята. Хочу начать программировать нормально. (Подкиньте полезной информации.)
Ребята. Хочу начать программировать нормально.
DublДата: Суббота, 16.10.2010, 03:40 | Сообщение # 1
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Итак. Суть в том, что я учусь в 10 классе, мы учим паскаль, это слишком элементарно. Я захотел учить Дельфи, первым делом я скал 7 версию среды. Затем нашел вот этот сайт. Выполнил все 11 уроков для новичков, в итоге кое-что понял и научился уже что-то делать. Но суть в том, что в уроках уже готовый код, а я хочу сам пробовать что-то писать, но не хватает знаний синтаксиса и самой структуры.

1. Пожалуйста подскажите хороший учебник(в ПДФ например) по Дельфи, в котором все обобщается, структура, типы. Желательно еще разновидности функций(так как запомнить я их еще не успел))).

2. Подскажите задачки какие-нибудь, чтобы попрактиковаться.

Просто перечитывать все учебники по ЯП напряжено, хочется узнать от знающих людей действительно стоящие труды по Дельфи. Заранее спасибо.

 
AdminДата: Суббота, 16.10.2010, 11:54 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Ну мне нравится книга написаная Ксавье Пачеко (точнее ее перевод) /load/2-1-0-7
Читать полностью лично я не читал не одной книги. Только искал нужные вещи.

Как научиться? Придумываете себе задание, и решаете его. Что не получается ищите в книгах, в сети, спрашиваете на форумах и т. д.

Ну например, мне как-то понадобилось в большом txt файле убрать в начале каждой строчки номер пункта (1. [текст], 2. [текст] и так далее, вот 1, 2 и убирал). Не долго думая написал программу, скормил ей файл получил что требовалось.
Ну или например стандартные программки - текстовые редакторы, графические редакторы (да и вообще работа с графикой), плееры, программы-тесты, всякие мелкие игрушки (сапер, пятнашки, например) или вот мы в институте по предмету (забыл как называется, но что-то с интеллектом связано) учили программу угадывать животное (программа спрашивала "животное летает?", "Животное большое?" и так далее, а в результате говорила кто это.). Конечно же это не искуственный интелект, но все же прикольно... smile


Не оказываю помощь через личные сообщения и ICQ
 
DublДата: Суббота, 16.10.2010, 22:56 | Сообщение # 3
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Так. Про книжку понял. Мне хочется где-то прочитать полностью о структуре программы(В паскале я знаю, а тут несколько иначе). Так же интересно где-то прочитать о структуре команды как например ммм,
1. Memo1.Lines.Delete(0); вот каков порядок написания терминов через точку?
2. Form1.SaveDialog1.FileName; тут вот какой порядок? Спева номер формы, затем компонент, затем вот что это в общем для всех функций?

Вот хотя бы это))

 
skycarДата: Воскресенье, 17.10.2010, 00:16 | Сообщение # 4
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Порядок такой, как ты и написал.
Через точку пишутся присущие методы/свойства объекта. В делфи выпадает список присущих методов и свойств при наборе имени объекта и ставл. точки. Свойство также может быть объектом, поэтому может быть и так
Code

Memo1.Lines.Add('тест')

Memo1 - объект, Lines - его свойство типа TStrings (этот тип является классом, у объектов типы - классы), и у этого объекта-свойства есть свой метод - Add(). Метод - функция/процедура, реализованная в пределах объекта. Если что непонятно - спрашивай
 
DublДата: Воскресенье, 17.10.2010, 01:18 | Сообщение # 5
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Спасибо большое, я вроде понял слегка, начал писать свой автокликер, нашел на этом сайте как узнать координаты мыши, но мне нужно чтобы координаты записывались в переменную по нажатии горячей клавиши, как сделать горячую клавишу для начала процедуры.

Вот мой код:
procedure TForm1.Button1Click(Sender: TObject);
var cur1:TPoint;
begin
Windows.GetCursorPos(Cur1);
end;

end.

Щас при нажатии кнопки записываются координаты, а как к кнопке приделать горячую клавишу(а лучше сочетание), и можно вообще без кнопки? т е чтобы процедура сразу реагировала на нажатие гор. клавиши(ш).

 
skycarДата: Воскресенье, 17.10.2010, 04:04 | Сообщение # 6
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Реализацию гор. клавиши нужно осуществлять с помощью самописного обработчика сообщений WM_HOTKEY (регится горячая клавиша в системе, и при её нажатии форме посылается особое сообщение системы)

Code

...
private
procedure OnPressKey(var Msg: TWMHotKey); message WM_HOTKEY; //наш обработчик

Code

...
implementation
procedure OnPressKey(var Msg: TWMHotKey);
begin
  inherited;
  YourProcedure; // действия проги при наж. кл.
end;

Code

procedure TForm1.FormCreate(Sender: TObject);
const ModCtrl = 2;
begin
  RegisterHotKey(Self.Handle, VK_F8, ModCtrl, VK_F8) // рег. комб. Ctrl + F8
end;

Code

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   UnRegisterHotKey(Self.Handle, VK_F8); // снятие рега
end;

регим комбинацию гор. клавиш при старте программы (событие OnCreate у формы), при закрытии соответственно снимаем рег. При нажатии этой комбинации наш обработчик (OnPressKey) будет реагировать и вызывать те действия, что ты там напишешь, т. к. форме будет отправляться сообщение системы о нажатии гор. клавиши.
 
DublДата: Воскресенье, 17.10.2010, 07:29 | Сообщение # 7
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Это шикарно. Спасибо огромное. Пойду дописывать свой автокликер)))

Добавлено (17.10.2010, 06:55)
---------------------------------------------
Хмхм. Такая проблема, я вот начал писать автокликер(вернее продолжил), хотел потестить программу, а она открывается пустой формой, и все, гляньте код пожалуйста, я знаю, что у меня куча всего совсем не рационально, но я делал из тех знаний которыми обладаю)) Помогите разобраться:

Code
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure OnPressKey(var Msg: TWMHotKey); message WM_HOTKEY; //наш обработчик
public
{ Public declarations }
end;

var
Form1: TForm1;
kordin:array [1..n] of real;
zzz:Boolean;
cur:TPoint;
label
GotoLabel;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const ModCtrl = 2;
begin
RegisterHotKey(Self.Handle, VK_F8, ModCtrl, VK_F8) // рег. комб. Ctrl + F8
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
zzz:=false;
end;

procedure OnPressKey(var Msg: TWMHotKey);
begin
inherited;
GotoLabel:
begin
zzz:=true;
Windows.GetCursorPos(Cur);
Label2:=('Координаты ',i,'ой точки: ' 'x: 'IntToStr(cur.X); 'y: 'IntToStr(cur.Y));
kordin[i]:=i+1;
if zzz=true then Goto GotoLabel;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(Self.Handle, VK_F8); // снятие рега
end;

end.

Добавлено (17.10.2010, 07:29)
---------------------------------------------
А или вот иногда бывает при запуске прога открывается и мгновенно закрывается.

 
skycarДата: Воскресенье, 17.10.2010, 13:51 | Сообщение # 8
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Хм, а компилится разве? Ты скопировал код своего модуля Unit? у тебя в массиве предел от 1 до какой-то там константы n, нигде не объявленной. И зачем использовать метки? в теле твоей метки идёт вызов её же:

Code

procedure OnPressKey(var Msg: TWMHotKey);
begin
inherited;
GotoLabel:
begin
zzz:=true;
Windows.GetCursorPos(Cur);
Label2:=('Координаты ',i,'ой точки: ' 'x: 'IntToStr(cur.X); 'y: 'IntToStr(cur.Y)); // а тут вообще что такое?
kordin[i]:=i+1;
if zzz=true then Goto GotoLabel; // условие в теле метки
end;
end;

Вот поэтому происходит что-то вроде бесконечного цикла. Ведь тут же переменная zzz принимает истинное значение, и дальше идёт вызов метки при условии, что переменная истинна. Лучше отказаться от меток, можно и без них обойтись
кстати, что это за переменная i, её объявления я нигде не увидел. также, не

Code

Label2:=('Координаты ',i,'ой точки: ' 'x: 'IntToStr(cur.X); 'y: 'IntToStr(cur.Y));

а

Code

   Label2.Caption:='Координаты ' + IntToStr(I) + '-й точки: X = ' + IntToStr(Cur.X) + '; Y = ' + IntToStr(Cur.Y);


Сообщение отредактировал skycar - Воскресенье, 17.10.2010, 13:53
 
DublДата: Воскресенье, 17.10.2010, 16:57 | Сообщение # 9
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Code
Label2:=('Координаты ',i,'ой точки: ' 'x: 'IntToStr(cur.X); 'y: 'IntToStr(cur.Y));

Это я просто в надписи2 вывожу координаты i-ой точки как в статье вроде на этом сайте.

Code
if zzz=true then Goto GotoLabel; // условие в теле метки

Что значит условие в теле метки? Я просто хочу, что если человек нажал на кнопку Button1, то запись координат закончилась, и можно было уже приступить к поочередному кликанию.

I это счетчик, того, сколько пользователь ввел координат.

n это просто конечный номер массива, только что, что-то, запутался как его описать, ну integer наверное.

Code
Label2.Caption:='Координаты ' + IntToStr(I) + '-й точки: X = ' + IntToStr(Cur.X) + '; Y = ' + IntToStr(Cur.Y);

Исправил, спасибо.

Вот про метку и где она объясните подробнее плиз, и как заменить метку чем-то более рациональным, если я хочу, чтобы суть осталась та же, т е пользователь нажал кнопку и процесс записи координат в массив прекратился.

 
skycarДата: Воскресенье, 17.10.2010, 18:25 | Сообщение # 10
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Ну вот же задекларирована метка GotoLabel

Code

var
Form1: TForm1;
kordin:array [1..n] of real;
zzz:Boolean;
cur:TPoint;
label
GotoLabel;  // GotoLabel и есть метка

Что в принципе также является ошибкой, так как делфи не допускает объявления меток в интерфейсном разделе модуля. Сама по себе метка является отсылкой к операторам, а при её вызове через goto идёт переход к операторам, описанным в метке. Если, к примеру, написать

Code

procedure LabelTest;
label L;
begin
  L: AnAction;
goto L;
end;

тогда будет постоянно идти вызов данной метки, и бует выполняться метод AnAction (ведь вызов не имеет никаких условий в данном случае). У тебя же в обработчике есть условие, если zzz равно истине, тогда вызывать описанные в метке операторы. Но в начале обработчика эта логическая переменная zzz сразу же принимает истинное значение, получается, условие выполняется всегда, будто его и нету smile
В чём твоя задача? записать по нажатии гор. клавиши кординаты в переменную типа TPoint и после кликать туда программно? или несколько координат загнать в массив и поочерёдно "кликать" в разные координаты?

Если второй случай, тогда так

Code

procedure ClickXY(x,y: word); // из статьи http://delphidevelop.ru/publ/10-1-0-22
begin
   {Преобразуем x и y к аболютным координатам курсора мышки}
   x := Round(x * (65535 / Screen.Width));
   y := Round(y * (65535 / Screen.Height));

  {Переместим курсор мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, x, y, 0, 0);
  {Имитируем нажатие левой кнопки мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
  {Имитируем отпускание левой кнопки мыши}
   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, x, y, 0, 0);
end;

Это процедура кликанья из статьи "Кликнуть левой кнопкой мыши в указанных координатах". Также нужен динамический массив типа TPoint, в нём будут храниться координаты нововыбранной точки

Code

var Coords: array of TPoint;
var N: Cardinal = 0;

procedure OnPressKey(var Msg: TWMHotKey);
var P: TPoint;
begin
inherited;
  SetLength(Coords, N + 1); // уст. длины массива
  Windows.GetCursorPos(P); // получаем коорд.
  Coords[N]:=P; //... и записываем в массив
  Inc(N); // аналог N:=N + 1;
end;

При нажатии горячей клавиши массив увеличивается на один элемент, в новый элемент записываются новые координаты. Потом в нужное время вызываем процедуру клика и вуаля

Code

procedure TForm1.Button1Click(Sender: TObject);
var P: TPoint;
  I: Cardinal;
begin
  for I:=0 to Length(Coords) - 1 do
begin
  P:=Coords[I];
  ClickXY(P.X, P.Y);
end;
end;

Обрати внимание, что первый элемент дин. массива имеет индекс 0, а не 1. Вот, при нажатии гор. клавиши записывается позиция курсора в новосозданный элемент массива, а по нажатии кнопки кликает в цикле по всем координатам в массиве. Правильно ли я понял твою задачу?
кстати, дин. массив по окончании работы с ним надо очищать,
Code
Coords:=nil
 
DublДата: Воскресенье, 17.10.2010, 19:21 | Сообщение # 11
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Опять же, огромное спасибо, даже не ожидал такого ответа. В целом я все понял, и я уже даже знаю как все будет, только про очистку не понял.
 
skycarДата: Воскресенье, 17.10.2010, 21:03 | Сообщение # 12
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
После работы с динамическим массивом его надо удалить из памяти, если он уже не требуется.
Code

  Coords:=nil;

Если же тебе нужно всё сбросить, очистить массив, тогда ему надо выставить нулевую длину, можно это сделать одной процедурой (если делать как в моём предыдущем посте)

Code

procedure AReset;
begin
  SetLength(Coords, 0);
  N:=0; // также обнулим счётчик
end;

и потом вызывать эту процедуру
Code

procedure TForm1.Button3Click(Sender: TObject);
begin
  AReset;
end;

например, написать такой вызов в событии OnClick какой-нибудь третей кнопки и подписать её "Сброс".
 
DublДата: Воскресенье, 17.10.2010, 21:25 | Сообщение # 13
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Code
unit Unit1;

interface

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

type
   TForm1 = class(TForm)
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     Label4: TLabel;
     Button3: TButton;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
     procedure Button3Click(Sender: TObject);
   private
     procedure OnPressKey(var Msg: TWMHotKey); message WM_HOTKEY; //наш обработчик
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   kordin:array [1..n] of real;
   zzz:Boolean;
   cur:TPoint;
   n: integer;
   i:integer;
   Coords: array of TPoint;
   var N: Cardinal = 0;
   P: TPoint;
   I: Cardinal;
label
   GotoLabel;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);  
const ModCtrl = 2;  
begin  
   RegisterHotKey(Self.Handle, VK_F8, ModCtrl, VK_F8) // рег. комб. Ctrl + F8  
end;

rocedure OnPressKey(var Msg: TWMHotKey);
begin  
inherited;  
   SetLength(Coords, N + 1); // уст. длины массива  
   Windows.GetCursorPos(P); // получаем коорд.  
   Coords[N]:=P; //... и записываем в массив  
   Inc(N); // аналог N:=N + 1;
   Label2.Caption:='Координаты ' + IntToStr(N) + '-й точки: X = ' + IntToStr(p.X) + '; Y = ' + IntToStr(p.Y);

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   for I:=0 to Length(Coords) - 1 do
begin
   P:=Coords[I];  
   ClickXY(P.X, P.Y);  
end;  
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);  
begin
    UnRegisterHotKey(Self.Handle, VK_F8); // снятие рега
end;

end.

Программа как у меня часто случается, после запуска сразу закрывается(((

 
skycarДата: Воскресенье, 17.10.2010, 22:05 | Сообщение # 14
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Да она походу не компилится, ведь у тебя пооставались ошибки в интерфейсном разделе.
Code

var
    Form1: TForm1;
    Coords: array of TPoint;
    var N: Cardinal = 0;

implementation  

должно быть так, а те неиспользуемые идентификаторы типа kord и zzz удали. Метка GotoLabel также не нужна, особенно в этом разделе. переменных P типа TPoint должно быть две локальные: в обработчике и в событии нажатии кнопки, а не одна глобальная. и ещё одно: не надо делать глобальной переменную-счётчик цикла, она должна быть локальна, т.е. в пределах процедуры.

Code

procedure TForm1.Button1Click(Sender: TObject);
var P: TPoint; // вот здесь
   I: Cardinal;
begin
   for I:=0 to Length(Coords) - 1 do
begin
   P:=Coords[I];
   ClickXY(P.X, P.Y);
end;
end;  

Code

procedure TForm1.OnPressKey(var Msg: TWMHotKey); // именно TForm1.OnPressKey
var P: TPoint; // и здесь, а не перед implementation
begin
inherited;
   SetLength(Coords, N + 1); // уст. длины массива
   Windows.GetCursorPos(P); // получаем коорд.
   Coords[N]:=P; //... и записываем в массив
   Inc(N); // аналог N:=N + 1;
Label2.Caption:='Координаты ' + IntToStr(N) + '-й точки: X = ' + IntToStr(p.X) + '; Y = ' + IntToStr(p.Y);  
end;  

Вообще переменную надо делать глобальной только тогда, когда это действительно нужно (например, использовать её значение для разных процедур или функций, массив в нашем случае, например, должен быть глобальным).

 
DublДата: Воскресенье, 17.10.2010, 22:19 | Сообщение # 15
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Эхх. Все равно не компилиться(( Что-же за такое то?)) Я уже совсем не понимаю в чем дело. Сделал локальные переменные, убрал лишние(( Обидно.
 
Форум » Все о Delphi » Начинающим » Ребята. Хочу начать программировать нормально. (Подкиньте полезной информации.)
Страница 1 из 212»
Поиск:

Copyright DelphiDevelop.ru © 2008-2018
Хостинг от uCoz