Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi

Автор: krast
Дата сообщения: 25.05.2005 10:13
ViktorSila
экземпляр класса?
test = ttest.create(self)
пойдет?
Автор: ViktorSila
Дата сообщения: 25.05.2005 10:14
krast
http://www.delphiworld.narod.ru/base/db_controls_no_db.html
Вторая часть статьи.
И в самом конце написано:

Цитата:
Для проверки работы можно использовать все тот же небольшой проект, включив в Uses модуль DataSet3 вместо DataSet0, а также модуль MyData, и добавив подключение к нашему экземпляру TMyDataSet определенных в модуле MyData обработчиков событий. Для этого, конечно, потребуется создать экземпляр TMyData.

Как создать экземпляр?
Автор: krast
Дата сообщения: 25.05.2005 10:15
объясни конкретно что ты хотишь. поможем

Добавлено:
ага, увидел, освобожусь, гляну, интересная статья

Добавлено:
токо я все равно не понял в чем проблема. в классе TMyData определяешь обрабочики событий, создаешь экземпляр этого класса. Ну и там где тебе нужно их прицепить к события - просто присваивание (главное здесь чтобы эти обработчики были реализованы в классе, ибо указатели на методы - это не просто обычные указатели - это два указателя, одни из которых используется для идентификации неявной переменной Self)

а конкретно и применительно к статье, попозже гляну, если надо будет
Автор: ViktorSila
Дата сообщения: 25.05.2005 11:20
krast
Как будет время глянь относительно этой статьи. И напиши более детально, что надо сделать.
Автор: Larry Laffer
Дата сообщения: 25.05.2005 12:07
Кто-нибудь создавал программу, которая бы могла компилировать независимый запускной файл? Например, есть программа, которой нужно передать картинку и звуковую дорожку, а она создает файл xxxx.exe, который отображает в окне эту картинку и проигрывает звук.

Заранее благодарен за ответ...
Автор: ViktorSila
Дата сообщения: 25.05.2005 12:13
krast

Цитата:
главное здесь чтобы эти обработчики были реализованы в классе, ибо указатели на методы - это не просто обычные указатели - это два указателя, одни из которых используется для идентификации неявной переменной Self

Приведи хоть один пример использования с двумя указателями.
Автор: OdesitVadim
Дата сообщения: 25.05.2005 12:29
Larry Laffer
Могу дать напутствие, как написать подобную вещь.
1) Пишеш прогу, которая показывает картинку и играет музыку, которые записаны у неё в ресурсах.
2) Делаеш прогу, которая берёт картинки, музыку, сделаную выше прогу (её можно в ресурсы запхать или переименовать с расширением .tpl, набросать в папочку и предлагать как шаблоны) и редактирует в ней ресурсы. Потом сохраняем.
Под NT функции редактирования ресурсов доступны, для 9х прийдётся поискать как это сделать ручками (редактирование структуры PE файла).

Вариант б. Чтобы с ресурсами не заморачиваться.
готовиш прогу-шаблон, но данные она считывает с свого конца. Тоесть в конец просто дописывае данные. Правда прийдётся придумать как ресурсы различать. (например первый байт - тип ресурса, след. 4 байта - длина. далее сам ресурс.)Будет работать под всеми системами. Правда некоторым антивирям может не понравиться.
Автор: krast
Дата сообщения: 25.05.2005 13:16
ViktorSila
сама ссылка на метод реализована как пара указателей - первый на код, второй - указатель на Self. Это видно по TMethod:


Цитата:
TMethod = record
Code, Data: Pointer;
end;


это из System модуля. а вот просто ссылка на процудуру (функцию) - это всего лишь указатель.

НО... это тебя в принципе не должнор волновать, я в прошлый раз не дописал свою мыслю, инет пропал, так вот, продолжаем:

в классе TMyData определяешь обрабочики событий (методы объекта), создаешь экземпляр этого класса. Ну и там где тебе нужно их прицепить к событиям - просто идет присваивание методов из экземпляра класса TMyData (который ты создал)
Автор: KDA
Дата сообщения: 25.05.2005 14:03
krast

Цитата:
блин, еще один...

Может, покажешь, как именно выглядит код под винду, обнуляющий глобы?
А то я уже очень давно считал, что нули вылезают на этапе создания секций загрузчиком PE.
И как применим термин "обнулять к глобы" вот к такому? :

type
TTest1 = (tOne = 1, tTwo = 2);
var
A : TTest1;
или
B : Integer = -1;
Автор: krast
Дата сообщения: 25.05.2005 14:26
KDA
глобальные переменные стандартных типов обнуляются (integer в 0, boolean в false, строчки в '' - но начет строчек = это совсем другая песня, все строчки обнуляются - глоб или нет - неважно). ты бушь с этим спорить? а как именно - компилятор гонит код (как думал раньше я, хотя для строчек отрабатывает именно компилятор) или
Цитата:
нули вылезают на этапе создания секций загрузчиком PE.
- это второй вопрос (потестировал примерчики, скорее всего так и есть, интересно было бы это почитать, ссылка не завалялась?). так в чем проблема-то, сам же писал:
Цитата:
генерит код для этого действа
Автор: OdesitVadim
Дата сообщения: 25.05.2005 14:34
KDA
krast
спецмально сделал маленький пример и дизассемблировал его. (компилятор D7, дизассемблер Ida).
Могу заявить: Явного кода обнуления глобальных переменных нет!.


Добавлено:
вот текст примера

Код:
program tes;
{$APPTYPE CONSOLE}
var a:integer;
begin
a:=1;
writeln(a);
end.
Автор: krast
Дата сообщения: 25.05.2005 14:39
OdesitVadim
блин, знал бы я еще asm, все руки не доходят. но по примерам посмотрел счас - да, не компилятор похоже гонит код, поэтому и прошу у КДА натолкнуть на инфу по его версии.

Добавлено:
OdesitVadim
а еще глянь что происходит когда а - string

Добавлено:
хотя... кажись все, нашел что хотел...
Автор: OdesitVadim
Дата сообщения: 25.05.2005 14:44
и объявление а в ассемблерном коде выглядит так

Код:
a dd ?
Автор: mr_eoi
Дата сообщения: 25.05.2005 14:58
OdesitVadim
15:34 25-05-2005
Цитата:
спецмально сделал маленький пример и дизассемблировал его. (компилятор D7, дизассемблер Ida).
Могу заявить: Явного кода обнуления глобальных переменных нет!.

А как тебе мысль, что все неинициализированные глобальные переменные помещаются в отдельный сегмент и инициализируются (обнуляются) системой при загрузке приложения. Вот в DOS программах инициализация (обнуление) проводилась явно.
Автор: KDA
Дата сообщения: 25.05.2005 15:05
krast
По "крайней мере" относилось к другим компиляторам, скажет Turbo Pascal под DOS.
Еще раз: переменные не обнуляются. А обнуляется принадлежащая им область памяти, а это несколько разные вещи. Скажем, в случае Boolean никто не обязан нам гарантировать, что двоичный 0 соответствует false (иначе было бы допустимо НЕЯВНОЕ преобразование в Integer, скажем, а этого нет). Или вот смотри приведенный выше пример с TTest1 - там появляется двоичный нуль, а с т.з. задачи переменая является невалидной. В случае стандартных типов разницы особой нет, но это всего лишь - особенности реализации, и можно закладываться на них, к примеру (как я делаю), но всегда отдавать себе отчет, что это может оказаться временным

Со стрингами, кстати, хорошо демонстрируется: на глобах - это тот же двоичный нуль (при операциях сравнения эквивалент ''). Больше похоже на "обнуление" в неглобах: всегда в неявном виде присутствует конструктор и деструктор, плюс еще доп код, т.е, не просто обнуление, а правильнее (извини за грубый псевдокод)

var S : String;
begin
...
end;

превращается в
begin
S.Init; //"обнуление"
try
...
finally
S.Free
end;
end;

C интерфейсами - так же. Так же, по поводу нулей, можно глянуть реализацию TObject.InitInstance и увидеть, что и Boolean'ы и String'и и вообще все затирается обычными нулями без малейшей поправки на тип

ЗЫ.. Почитать - для начала MSDN по структуре PE
Автор: OdesitVadim
Дата сообщения: 25.05.2005 15:17
mr_eoi
с твоей мыслью полностью согласен
я же написал

Цитата:
a dd ?

это обо всём говорит
"обнуление" выполняет загрузчик, руководствуясь "заметками и указаниями" компилятора, оставленных в exe'шнике, не прога.
Автор: krast
Дата сообщения: 25.05.2005 15:22
KDA

Цитата:
плюс еще доп код, т.е, не просто обнуление, а правильнее (извини за грубый псевдокод)

ну, на самом деле, там происходит так:
Pointer(S) := nil;

тож самое с дин. массмивами

при выходи за пределы зоны видимости _LStrClr(S);

ну, короче, практически все функции для работы со строчками и массива подменяются на системные функции.

Добавлено:
да, там только разница с константной локальной строчкой - никакого управления памятью вообще для нее не ведется.
Автор: ViktorSila
Дата сообщения: 25.05.2005 16:53
krast

Цитата:
в классе TMyData определяешь обрабочики событий (методы объекта), создаешь экземпляр этого класса. Ну и там где тебе нужно их прицепить к событиям - просто идет присваивание методов из экземпляра класса TMyData (который ты создал)

Ты наверно плохо посмотрел статью. Программа содержит два модуля. Исходник:

Цитата:

program Dataset;
uses
Forms,
DB,
DBGrids,
DBCtrls,
Controls,
DataSet3, // первый модуль
MyData; // второй модуль

var
F: TForm;
DS: TDataSource;
MyDataSet: TMyDataSet;
MyDataEx: TMyData;
begin
Application.Initialize;
Application.CreateForm(TForm, F);
F.Width := 300;
F.Height := 300;
F.Position := poDesktopCenter;
MyDataEx := TMyData.Create;
MyDataSet := TMyDataSet.Create(F);
MyDataSet.Open;

DS := TDataSource.Create(F);
DS.DataSet := MyDataSet;
with TDBNavigator.Create(F) do
begin
Parent := F;
Align := alTop;
DataSource := DS
end;
with TDBGrid.Create(F) do
begin
Parent := F;
Align := alClient;
DataSource := DS
end;
Application.Run;
end.

Но как сделать чтобы экземпляр TMyData, можно было увидеть(вызвать процедуру) в модуле MyDataSet???
Автор: Larry Laffer
Дата сообщения: 25.05.2005 16:59
Есть здесь люди, работавшие с библиотечкой unrar.dll? Приведите, пожалуйста, пример для извлечения архива защищенного паролем. В сети есть много примеров работы с библиотекой, но интересующую меня функцию я еще не встречал.

Заранее благодарен...
Автор: KDA
Дата сообщения: 25.05.2005 17:06
krast

Цитата:
ну, на самом деле, там происходит так:
Pointer(S) := nil;

На самом деле это именно конструктор, пусть он так и просто выглядит (инлайн, однако)
так же как и _LStrClr(S) в простейшем случае приведет в результате к освобождению памяти - можно сильно не копаться, а просто в сорцы заглянуть
Автор: krast
Дата сообщения: 25.05.2005 17:09
ViktorSila
я пока еще ее вообще не читал... но если тебе надо работать с объектом MyData в классе MyDataSet, передай его его через конструктор например, ну, и понятно, в uses MyDataSet пропиши ссылку на MyData. если я тебя правильно понял.

Добавлено:
KDA
дык я не спорю, я уточнил


Цитата:
На самом деле это именно конструктор

конешна конструктор, ведь для строки определены счетчик ссылок, флаги по распределении памяти, строки же сидят в динамической памяти
Автор: Fox0001ww
Дата сообщения: 25.05.2005 19:12
Большое спасибо, Господа, за помощь. Весьма признателен.
Автор: Larry Laffer
Дата сообщения: 27.05.2005 10:35
Подскажите, как подключить мышку к программе на Паскале и заставить программу обрабатывать клики?

Заранее благодарен...
Автор: FAngel
Дата сообщения: 27.05.2005 12:30
Larry Laffer
Во первых должен буть запущен драйвер мыши (чего-нибудь типа mouse.com), во вторых через $33 прерывание получаешь все что тебе надо (не забудь прочитать документацию по его использованию).
P.S. Если найду свои старые исходники (помнится я еще и эмулятор мыши для SVGA режимов писал), могу поделится
Автор: Larry Laffer
Дата сообщения: 27.05.2005 12:36

Цитата:
P.S. Если найду свои старые исходники (помнится я еще и эмулятор мыши для SVGA режимов писал), могу поделится

FAngel, было бы очень замечательно.
Автор: ViktorSila
Дата сообщения: 28.05.2005 12:19
krast
В uses прописываю MyData, но выдает ошибку:

Цитата:
Circular unit reference to 'DataSet3'

Автор: OdesitVadim
Дата сообщения: 28.05.2005 13:27
ViktorSila
Сделел циклическую ссылку - юниты ссылаються дру на дружку.
Наиболее простой способ решить - uses можно писать как секции interface, так и в implemetation. Поэтому напиши в одном юните в одном месте, а в другом - в другом.
Но если у тебя так получилось, значит неакуратно програмишь. Обычно решаеться перетаскиванием определением некоторых переменных с одного юнита в другой.
Автор: Larry Laffer
Дата сообщения: 29.05.2005 08:42
Подскажите, как можно (и можно ли вообще) в стандартной компоненте PopupMenu выделить один Caption жирным шрифтом?
Автор: mr_eoi
Дата сообщения: 29.05.2005 08:56
Larry Laffer
09:42 29-05-2005
Цитата:
Подскажите, как можно (и можно ли вообще) в стандартной компоненте PopupMenu выделить один Caption жирным шрифтом?

Надо соответствующему TMenuItem сделать Default := true;
Автор: Larry Laffer
Дата сообщения: 29.05.2005 16:40
Подскажите, пожалуйста, как сохранить в текстовый файл содержимое бинарного файла в шестнадцатиричном виде?

Заранее благодарен за ответ...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.