Ребята. Хочу начать программировать нормально. |
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 и убирал). Не долго думая написал программу, скормил ей файл получил что требовалось. Ну или например стандартные программки - текстовые редакторы, графические редакторы (да и вообще работа с графикой), плееры, программы-тесты, всякие мелкие игрушки (сапер, пятнашки, например) или вот мы в институте по предмету (забыл как называется, но что-то с интеллектом связано) учили программу угадывать животное (программа спрашивала "животное летает?", "Животное большое?" и так далее, а в результате говорила кто это.). Конечно же это не искуственный интелект, но все же прикольно...
Не оказываю помощь через личные сообщения и 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 сразу же принимает истинное значение, получается, условие выполняется всегда, будто его и нету В чём твоя задача? записать по нажатии гор. клавиши кординаты в переменную типа 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. Вот, при нажатии гор. клавиши записывается позиция курсора в новосозданный элемент массива, а по нажатии кнопки кликает в цикле по всем координатам в массиве. Правильно ли я понял твою задачу? кстати, дин. массив по окончании работы с ним надо очищать,
|
|
| |
|
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 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
| Эхх. Все равно не компилиться(( Что-же за такое то?)) Я уже совсем не понимаю в чем дело. Сделал локальные переменные, убрал лишние(( Обидно.
|
|
| |
|