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

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: svs123456789
Дата сообщения: 25.02.2011 13:21

Цитата:
Был помнится такой компилятор, который паскаль-код в С++ перегонял, а потом с помощью GCC его компилял. Но вообще код на делфи это ведь не только сплошные конструкции языка, это еще и обращения к RTL и VCL. Их ни в шарпе ни в джаве нету.

Frodo_Torbins
ну собственно я и не рассчитывал на VCL под .NET?
просто есть алгебра на несколько страниц и хотелось бы автоматически перевести синтаксис на другой язык...
когда то мелькал конвертер толи из паскаля в си


psa1974

Цитата:
Программирование - это большой труд, это куча потраченного времени и масса информации, с которой надо разбиратся, нахрапом это дело не возьмешь. Это только в сказке программирование можно выучить за 21 день. Думаю, тебе стоит подумать о других направлениях самореализации. Это просто совет.

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

Автор: Frodo_Torbins
Дата сообщения: 25.02.2011 14:14
svs123456789
Подборку конверторов можно найти на торри: http://www.torry.net/pages.php?id=1518
А с этим GNU Pascal что то не понятно. В документации сказано, что он использует бекэнд gcc. Наверно имеется в виду асемблер. К сожалению проверить нет возможности.
Еще вариант использовать Delphi Prism, а потом .NET Reflector-ом получить C#-код.
Автор: greenpc
Дата сообщения: 25.02.2011 14:41
Frodo_Torbins
ShIvADeSt
Cryogen2003
psa1974
Ну что Вы на человека накинулись. Вспомните какими были сами в 14 лет
Идея ведь интересная/геморойная - распознование речи
andrey777k
а Вас никто не унижает - просто дают совет нажать F1 и почитать help, если нет возможности/желания читать книги.
а по теме _http://it.kgsu.ru/Pascal/pas0061.html
Автор: XOBAH
Дата сообщения: 10.03.2011 15:05
Здравствуйте! Помогите пожалуйста!
Delphi начал изучать с полмесяца назад, а мне сегодня срочно понадобилось следующее:

Создал программу, она использует два внешних файла File.exe и File2.max. Их общий размер примерно полтора мегабайта
И мне надо чтобы моя программа была одним exe файлом, а эти два были внутри нее. Эти файлы нужны мне чтобы скопировать их из программы. Как это реализовать?

Вопрос снят
Автор: Wadim51
Дата сообщения: 14.03.2011 08:24
Здравствуйте.
Извиняюсь, если данный вопрос уже измусолен, искал, всю ночь весь интернет облазил, и данный форум, но все-таки пришлось спросить. Опыта в программировании у меня можно сказать нет, но это не суть думаю важно. Интересует не конкретные примеры с кодом, а хоть в какую сторону копать, и как по идее это может быть сделано.
В данный раздел написал, потому что пример реализации который меня интересует сделан именно в программе на Dekphi.
Множите подсказать, каким образом в программах полуавтоматического заполнения HTML форм на странице туда, в эту самую загруженную страницу внедряются элементы выбора из списка того, что в водить. На примере есть такая многим известная программа Allsubminner там есть полуавтоматическая регистрация. Когда пользователь загружает страницу в окно программы, возле каждого поля ввода появляется выпадающий список. В выпадающем списке перечислены заранее заполненные поля. Когда пользователь выбирает нужное название поля в каждом из выпадающих списков, то текст введенный в это поле автоматически заносится в расположенное рядом поле ввода. Еще есть несколько подобных программ, где загружается страница, на страницы внедряются различные элементы. Не могу понять, как это делается, потому что например Allsubminner если нажать правой кнопкой на просмотр кода, то код там неизменный. Еще есть плагин для Firefox который тоже внедряет нечто подобное на страницы, но он изменяет код. Нашел пока только функцию JavaScript innerHTML которая позволяет что-то внедрять.
Если кто-то знает каким образом сделано внедрение выпадающих списков в вышеупомянутой программе, иди любом из её аналогов, пожалуйста напишите, в какую строну копать. Пожалуйста, напишите хоть какие запросы в поиск вводить если вопрос тупой.
Заранее всем СПАСИБО.
Автор: Man_Without_Face
Дата сообщения: 14.03.2011 13:31
Добрый день. В Dll есть рекорд:
[more]
PReceiveData = ^TReceiveData;
TReceiveData = record
CenterSource: Word;
ObjectSource: Word;
Data: Pointer;
end;
----------------------------------------
function OnReceiveData(var Data: Pointer): Boolean; stdcall; export;
-----------------------------------------
function OnReceiveData(var Data: Pointer): Boolean;
begin
PSendData.CenterDest := 2200;
PSendData.ObjectDest := 39;
PSendData.Data := data;
Result := true;
end;
[/more]
В exe описана такая же структура, загружаю Dll:
[more]
var
PSendData: ^TSendData;
PReceiveData: ^TReceiveData;
-------------------------------------------
procedure TfrmMain.FormShow(Sender: TObject);
begin
ClientHandle := LoadLibrary('bClient.dll');
if ClientHandle = 0 then
begin
ShowMessage('Ошибка при загрузке bClient.dll');
WriteLog('Ошибка при загрузке bClient.dll');
end
else
WriteLog('bClient.dll загружена');

@OnReceiveData := GetProcAddress(ClientHandle, 'OnReceiveData');
end;
[/more]
Вопрос: как получить значения CenterDest и ObjectDest?
cxCurrencyEdit1.value := ?
Автор: greenpc
Дата сообщения: 14.03.2011 14:55
Man_Without_Face
может так
var
rData : PReceiveData;
...
OnReceiveData(rData);
showmessage(inttostr(rData^.CenterSource));
пс а откуда в длл PSendData? там же описан TReceiveData

Автор: Man_Without_Face
Дата сообщения: 14.03.2011 15:06

Цитата:
OnReceiveData(rData);

av по адресу 04822614
Автор: greenpc
Дата сообщения: 14.03.2011 15:46
Man_Without_Face
main

Код: procedure TForm1.btn1Click(Sender: TObject);
var
vData : TReceiveData;
pvdata : PReceiveData;
begin
pvdata :=@vData;
OnReceiveData(Pointer(pvdata));
ShowMessage(IntToStr(pvdata^.CenterDest));
end;
Автор: Man_Without_Face
Дата сообщения: 14.03.2011 16:06
greenpc
Данные не те получаю:
CenterDest = 62716
ObjectDest = 18
Автор: greenpc
Дата сообщения: 14.03.2011 16:16
Man_Without_Face
у меня все ОК
возможно у Вас смотрит не на тот указатель (структуру)
воспроизведите мой код под ковриком #
Автор: Man_Without_Face
Дата сообщения: 14.03.2011 16:53

Цитата:
возможно у Вас смотрит не на тот указатель (структуру)

да вроде все нормально.

Цитата:
воспроизведите мой код под ковриком #

стесняюсь спросить, а это как?

Автор: greenpc
Дата сообщения: 14.03.2011 17:01
Man_Without_Face
кнопочка "Редактировать" на моем сообщении
Автор: Man_Without_Face
Дата сообщения: 14.03.2011 17:10
greenpc
Тоже самое. Функцию правильно вызываю?

@OnReceiveData := GetProcAddress(ClientHandle, 'OnReceiveData');
Автор: Frodo_Torbins
Дата сообщения: 14.03.2011 21:02
Wadim51
Попробуйте так: http://delphikingdom.com/asp/viewitem.asp?catalogid=1410

Man_Without_Face
У вас отсутствует ключевое слово packed в описании записи. В этом случае работоспособность любого подобного кода будет зависеть от настроек комилятора. Второй важный момент это менеджер памяти: http://www.gunsmoker.ru/2009/01/blog-post.html Кстати в этом же блоге есть хорошая статья про работу с указателями если вдруг возникнут вопросы.

greenpc
В вашем коде возможен AV т к записи являются автоматически управляемым типом данных.
Автор: greenpc
Дата сообщения: 15.03.2011 09:28
Man_Without_Face
вызываете правильно
только я бы добавил

Код:
procedure TfrmMain.FormShow(Sender: TObject);
type
TOnReceiveData = function (var Data: Pointer): Boolean; stdcall;
var
OnReceiveData : TOnReceiveData ;
ClientHandle : THandle;
begin
ClientHandle := LoadLibrary('bClient.dll');
try
if ClientHandle <32 then
begin
ShowMessage('Ошибка при загрузке bClient.dll');
WriteLog('Ошибка при загрузке bClient.dll');
end
else
WriteLog('bClient.dll загружена');

@OnReceiveData := GetProcAddress(ClientHandle, 'OnReceiveData');
if @OnReceiveData <> nil then OnReceiveData (............);
....
finally
FreeLibrary(ClientHandle);
end;

end;

Автор: Man_Without_Face
Дата сообщения: 15.03.2011 10:04
Frodo_Torbins
Спасибо, статьи интересные.

Поставил packed в описании записей в exe и в Dll, прописал в uses
на первом месте ShareMem и там и там. Но значения все равно не те получаю...


Добавлено:
greenpc
ок, спасибо. Использую Delphi 2009.
Автор: greenpc
Дата сообщения: 15.03.2011 11:40
Man_Without_Face
тогда еще раз Ваши модули в студию
Автор: Man_Without_Face
Дата сообщения: 15.03.2011 11:55
greenpc
Frodo_Torbins
Всем спасибо, вопрос решил:
Dll:
PReceiveData(Data)^.CenterSource := 2200;
PReceiveData(Data)^.ObjectSource := 39;
Result := true;
exe:
procedure TfrmMain.cxButton1Click(Sender: TObject);
var
vData : PReceiveData;
begin
OnReceiveData(@vData);
cxCurrencyEdit1.Value := vData.CenterSource;
cxCurrencyEdit2.Value := vData.ObjectSource;
end;
Я так понимаю, после отработки функции в dll,
vData уничтожалась, поэтому в exe брались другие значения.
Автор: Wadim51
Дата сообщения: 16.03.2011 03:30
Frodo_Torbins СПАСИБО.
Признаться пока мало понял из того что там написано, но стараюсь переварить.
Сам нашел это
webdelphi.ru/2009/08/izmenyaem-html-kod-v-webbrowser/
и это
webdelphi.ru/2009/08/vybor-elementov-v-select-delphi/

Признаться не думал, что, чтобы сделать нечто подобное прийдется прибегать к использованию стороннего языка програмирования.
Странно, во всех браузерах, что мне встречались, в многих программах даный вопрос решен, но не где толком не удается найти как это делается. Удается найти упомянание опочти всем, по крайней мере в обобщенной форме, но данная тема вообще вероятно не кого не интересует...
Буду разбираться дальше.
P.S. Кстати да, сделал все как в премере по первой ссылке в этом посте, действиельно, нажимаю правой кнопкой мыди, смотрю код, внесенные на страницу изменения не ведны в коде.
"Истина гдето рядом".....
Автор: Man_Without_Face
Дата сообщения: 24.03.2011 09:52
Есть указатель на рекорд, подскажите как прочесть значение 5го байта рекорда?

procedure OnReceivePacket(ReceiveData: pointer);
var ppUin: cardinal;
pNum: byte;
begin
Move(ReceiveData^, ppUin, 4);
if ppUin = 123456789 then
begin
inc(ReceiveData, 4); // ???
Move(ReceiveData^, pNum, 1);
showmessage(inttostr(pNum));
end;
end;

Добавлено:
Вроде как-то так:
inc(cardinal(ReceiveData), 4);
Автор: Frodo_Torbins
Дата сообщения: 24.03.2011 11:45
Man_Without_Face
В вашем коде можно без Move, простым присваиванием.
Кстати есть еще такой вариант:

Код: type
TByteAccess = packed record
First, Second, Third, Forth: Byte;
end;
PByteAccess = ^TByteAccess;
var p:PByteAccess;
begin
p:=@Caption[1];
Button1.Caption:=Char(p^.Third);
end;
Автор: Man_Without_Face
Дата сообщения: 24.03.2011 13:02
Frodo_Torbins
ок, спасибо. Тогда такой вопрос:
Вышеописанная функция из Dll. На месте showmessage будет case, т.е. если = 1 нужно вызвать одну функцию из exe, если = 2 то другую.
В exe в dpr прописал:
exports
Ping name 'Ping';

в unit'e:
function Ping(var CenterSource: word; CenterObject: word; FromHostIP: Uint64): Boolean; stdcall; export;

Как Ping вызвать из Dll? В нете есть пара примеров, но толком ничего не понял.
Автор: Frodo_Torbins
Дата сообщения: 24.03.2011 16:06
Man_Without_Face
На сколько я помню, это будет работать только с явным вызовом (через GetProcArdess). Причем таким образом длл может вызвать функции лишь того экзешника, который ее загрузил. Еще одно ограничение - чтобы GetProcArdess нормально отработала, в экзешнике должна быть секция экспорта. А эту секцию очень часто специально вырезают для экономии памяти, так что проверьте настройки компилятора.
Избавится от всех этих проблем одним махом можно явно передавая в длл адреса функций обратного вызова. Если же таких функций предвидится много, то можно применить интерфейсы, примерно так: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
Автор: InkMission
Дата сообщения: 29.03.2011 16:01
как реализовать в Delphi 7 вывод в memo случайной строки из из файла *.txt ?
Автор: Frodo_Torbins
Дата сообщения: 29.03.2011 17:52
InkMission
Загрузите файл в TStringList а потом функцией Random выберите какую строку выводить.
Автор: ShIvADeSt
Дата сообщения: 30.03.2011 05:50
Frodo_Torbins

Цитата:
Загрузите файл в TStringList а потом функцией Random выберите какую строку выводить.

У Мемо вроде тоже есть возможность обращаться к любой строке. В крайнем случае можно заюзать АПИ функции, которые возвращают строку по номеру.
Автор: Frodo_Torbins
Дата сообщения: 30.03.2011 12:08
ShIvADeSt
Я думаю, у InkMission была проблема сделать хоть как-нибудь. И как мне кажется, вариант со стринглистом довольно неплохой. Единственное что мне не понятно, так это почему в примерах на delphibasics.ru нету удаления объектов. Либо там все для Delphi.Net, либо тот, кто их писал, сам в делфи не разбирается.
Автор: ShIvADeSt
Дата сообщения: 31.03.2011 06:23
Frodo_Torbins

Цитата:
Я думаю, у InkMission была проблема сделать хоть как-нибудь.

Посмотрел хелп
Memo1.Lines - возвращает строки, которые находятся в Мемо (тип TStrings).
Тьфу, блин. Я прочитал задание с точностью до наоборот Я думал из Мемо вывести в файл случайную строку. А ему надо из файла в Мемо, тогда Вы абсолютно правильно предложили.
Автор: Man_Without_Face
Дата сообщения: 31.03.2011 11:49
Frodo_Torbins

Цитата:
Избавится от всех этих проблем одним махом можно явно передавая в длл адреса функций обратного вызова

Не получается вызвать callback функцию с нужного мне места:
[more]
library bCLIENT;
........................
type
tProc = function(x, y: integer):integer;

function FromDll(p:tProc):integer; export;
begin
//{Result := }p(5, 6); // так значения передает
Fping := p;
end;

exports
FromDll name 'FromDll';
........................
в одном из юнитов dll создаю переменную:
Fping: tProc;
......................
в другом юните пытаюсь вызвать функцию:
Fping(22, 33); // параметры не передаются
.......................
exe
на формшоу передаю адрес функции:
FromDll(@MyCallBack);
.....................................
unit ServerFunctions;
interface
function FromDll(p:pointer):integer; external 'bClient.dll' name 'FromDll';
function MyCallBack(x, y:integer):integer;
....................................
function MyCallBack(x, y:integer):integer;
begin
showmessage(inttostr(x)+ ' '+inttostr(y));
end;
[/more]
а еще после закрытия exe, dll не выгружается (по логам вижу). Delphi2009.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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