Обсуждение Программирование на Delphi/Pascal

Эта тема предназначена для обсуждения и решения любых проблем, связанных с программированием на языке Delphi/Pascal, обмена секретами, опытом и помощи в программирование другим пользователям.

В программировании в полной мере действует правило: "Каков вопрос, таков ответ". Если вы действительно озабочены получением ответа на ваш вопрос, вам рекомендуется прочесть документ под названием "Как правильно задавать вопросы".
Как правильно задавать вопросы © Eric S. Raymond написал(а):
В мире хакеров, стиль ответов, которые вы получаете на задаваемые технические вопросы, зависит от способа задания вопросов не меньше, чем от их сложности. Это руководство научит задавать вопросы так, чтобы увеличить вероятность получения удовлетворительного ответа.

Дальше читать здесь...
Приятного чтения.
Господа, прежде чем начать хотел бы заострить ваше внимание на необходимости знания
Wikipedia написал(а):
Информационное пространство на английском языке, включающее периодическую и непериодическую печать, телевидение, кино, радио, библиотечные фонды, английский сектор Интернета и прочие источники, является в настоящее время беспрецедентным по объёму и содержанию. На английском языке написан огромный объём художественной и научно-технической литературы. Техническая, технологическая, патентная документация, научные публикации зачастую существуют только на английском языке или переведены на весьма ограниченное число языков. Всё это в совокупности делает английский язык важнейшим средством коммуникации в мире.
. Повторю ещё раз, технический английский это латынь в мире информационных технологий и особенно в программировании. Значительная часть полной и актуальной информации, необходимой для успешного решения задач на ниве программирования, доступна только на английском языке. Русскоязычные (как и любые не англоязычные, бедные японцы :) ) источники как правило являются переводами и грешат наличием неточностей, неполным изложением материала и устаревшими сведениями. К русскоязычной литературе приведённой здесь это относится в полной мере.

Основы языка



Руководства по работе со средой, базами данных, построению графического интерфейса и т.п.



Не стоит забывать что Delphi это обычная среда разработки под Windows (ныне уже и MacOS) и поэтому масса вопросов, которая будет у вас возникать, будет относиться не собственно к Delphi, а к программированию вообще (алгоритмы, методы и приёмы разработки ПО) и к написанию программ именно для Windows.

Windows



Книги для усиленной ежедневной медитации. Это книги по программированию вообще, а не по программированию на Delphi или под Windows.

Искусство программирования

  • DRKB (Delphi Russian Knowledge Base) — это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым. DRKB является одним из самых известных и полных Delphi FAQ на русском языке.
 

    [Dяgilev]

    очки: 11
    Нет комментариев

    Honey

    очки: 19
    хорошее сообщение!

    levko

    очки: 990
    +++
D

De[M]oN

Хочу расказать про пасхальные яйца в Delphi 6 и 7 (может быть и в других есть, не проверял).
Для того чтобы их увидеть нужно открыть About box (Help>About) и набрать одно из следующих слов с нажатой клавишой Alt:

1. DEVELOPERS - список сотрудников отдела Borland R&D
2. TEAM - список всех сотрудников Borland связанных с проектом Delphi.
3. QUALITY - список всех сотрудников отдела Quality Assurance работавших над проектом.
4. JEDI - JEDI project (Joint Endeavour of Delphi Innovators).

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

Neo_S

Ословед
Есть программа, имеет 2 эдита и кнопку. Нужно написать прогу, которая бы автоматически заполняла эти эдиты и нажимала на кнопку.
Заранее спасибо.
 
B

Boss Artem

Neo_S написал(а):
Есть программа, имеет 2 эдита и кнопку. Нужно написать прогу, которая бы автоматически заполняла эти эдиты и нажимала на кнопку.
Заранее спасибо.
ДАю наводку - SetWindowText(hw,pChar('mytext')); - где hw это хендл эдита или так SendMessage(hw,WM_SETTEXT,0,Integer(PChar('mytext')));

sendmessage(h, BM_CLICK, 0,0); где h - хэндл батона.

получить хэндл можно по координатам смотри windowfrompoint

Либо второй вариант - сэмулировать нажатие кнопок на клаве в этом тебе поможет keybd_event.

Если я правильно понял ты пишеш брутфорсер, ага?=)
вот я кой-че писал, по словарю и полным перебором, может пригодица.
 

Neo_S

Ословед
Еще вопрос возник. В общем создается сообщение (Showmessage('тут_текст'); ) Как бы прочитать этот "тут_текст", если известен заголовок формы. Координаты таблички не известны.
 
B

Boss Artem

Neo_S написал(а):
Еще вопрос возник. В общем создается сообщение (Showmessage('тут_текст'); ) Как бы прочитать этот "тут_текст", если известен заголовок формы. Координаты таблички не известны.
хмм... Чувствую что showmessage выводит этот текст в простой label. А label, как известно, хэндла не имеет =((. Так что вариант с хэндлами отпадает.
Может хуками можно как-то перехватить, но я к сожалению в них мало че шарю =(.
Пока назрел тока вариант с поиском ячейки памяти - ищещь артманей смещение в памяти, куда записывается твой текст и получаешь в своей проге данные прям оттуда.
P.S. А может все куда проще и я туплю =).
 

Bob

Ословед
Boss Artem написал(а):
Пока назрел тока вариант с поиском ячейки памяти - ищещь артманей смещение в памяти, куда записывается твой текст и получаешь в своей проге данные прям оттуда.

Да, дело это не тривиальное. По крайней мере есть 2 пути:
1. Дебагером/дизассемблером найти в исследуемой проге место(а) где вызывается интересующий нас ShowMessage.
Затем юзая DebugActiveProcess, подключаемся к этому процессу и устанавливаем брейкпоинты на эти адреса.
Результат - при каждом вызове ShowMessage, управление будет получать наша процедура, ну и там дальше со стека берем адреса буферов lpHeader, lpText. В общем читаем текст.

2. Распознавать образ, переводить его в текст, как это делает FineReader. Это уже намного сложнее.
 
B

Boss Artem

Теперь и меня вопросик - как сделать так чтобы окно программы не отображалось на панели задач?(например как в винде работает пуск - выполнить - создает окно которое не отображается на панели задач.)
 

cz

Ословед
Boss Artem написал(а):
Теперь и меня вопросик - как сделать так чтобы окно программы не отображалось на панели задач?(например как в винде работает пуск - выполнить - создает окно которое не отображается на панели задач.)
Код:
Application.CreateHandle;
ShowWindow(Application.Handle, SW_HIDE);
Application.ShowMainForm := FALSE;
При нормальном поведении TApplication создает дескриптор и показывает окно прежде, чем далее начнет что-то "происходить". Чтобы избежать этого, необходимо создать модуль, содержащий единственную строчку в секции initialization:
Код:
IsLibrary := True;
поместить этот модуль ПЕРВЫМ в .DPR-файле в списке используемых модулей. Этим "одурачиваем" TApplication, и оно думает что оно запущено из DLL, тем самым изменяя свое обычное поведение.
 

cz

Ословед
кроче у мя тоже проблема...
1)каким методом через ADOX_TLB добавить запись в таблицу(access)?
2)создаю DAO таким образом -
Код:
[COLOR=#000000]access := CreateOleObject('DAO.DBEngine.35');
[/COLOR]
- не хочет, что не так?

 
D

DrPadawan

Neo_S

Есть ф-ии EnumChildWindows и FindWindow. С помощью второй можно найти идентификатор окна искомой программы в системе (обычно по заголовку Caption). А потом с помощью первой перебрать все элементы (контролы) в окне и там уже по факту определять где editbox, а где кнопка.
 
D

De[M]oN

Ещё можно через FindWindow и FindWindowEx
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  wnd: hwnd;
  ed1,ed2: hwnd;
  bt1: hwnd;
begin
  wnd:=FindWindow('TForm1','Введите пароль');
  if wnd=0 then exit; //окно не найдено
  ed1:=FindWindowEx(wnd,ed1,'TEdit','Edit1');
  ed2:=FindWindowEx(wnd,ed2,'TEdit','Edit2');
  bt1:=FindWindowEx(wnd,ed2,'TButton','ОК');
  if (ed1=0)or(ed2=0)or(bt1=0) then exit; // не найдено контролов
  SetWindowText(ed1,'user');
  SetWindowText(ed2,'pass');
end;
 
Подскажите, можно ли из компонета DBGrid копировать выделенное содержимое (Ctl+C).
 
B

Boss Artem

Помогите нубу - не могу обработать нажатие enter в edit'e.Примерно такой код:
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
...
if (key=#13) then dbgrid1.SetFocus;
...
end;
остальные батоны таким макаром намана обрабатываю, а с ENTER'ом чета лажа выходит - как будто ваще компонент не посылает мессагу что кто-то нажал в нем ENTER.=)Этот edit - фильтр dbgrid'a, при нажатии ENTER'a я хочу переводить фокус на сам dbgrid.
 
K

KeyMan

Попробуй добавить в иф еще or(key=#10) или же у тебя глюки непосредственно с dbgrid1.SetFocus;
 
у меня тут вопрос не совсем по теме: игру хочу написать небольшую, но немного запутался в наследовании классов. подскажите, если можете:

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

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

пусть класс с общими для всех предметов полями будет называться TItem, остальные - скажем, TWeapon, TArmour, TFood.

мне на ум приходит лишь банальность типа объявить класс TItem_, который будет наследовать все классы предметов, объединив в себе все поля. но этот метод мне кажется некрасивым. есть ли другой путь?
 

byterus

Ословед
zveroboy написал(а):
мне на ум приходит лишь банальность типа объявить класс TItem_, который будет наследовать все классы предметов, объединив в себе все поля. но этот метод мне кажется некрасивым. есть ли другой путь?

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

Boss Artem

KeyMan написал(а):
Попробуй добавить в иф еще or(key=#10) или же у тебя глюки непосредственно с dbgrid1.SetFocus;
не помогло, и глюки не с dbgrid.setfocus - это точно, потому как заместо него я пробовал подставлять showmessage('ok'), все равно не работает, походу глюки с самим объектом edit. Сам попробуй и убедись.
Выходит эт че, компонент переписывать надо чтоб нажатие ENTER'a обработать?...
 
Сверху