Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизПроблема с DLL и StrinGrid-ом... Найти похожие ветки
← →
Marat_D © (2004-04-02 04:54) [0]На главное форме имеется StringGrid1 нужно загрузить (сохранить) в него файл, например, Grid.txt с помощью своей DLL – LoadGridDLL.dll по нажатию кнопки Button1. Метод загрузки DLL динамический.
Вопрос заключается в том: Почему, когда размер StringGrid-a очень большой 100x100 и когда пытаешься загрузить/сохранить файл с помощью функций DLL программа виснет ??? Почему ? Может я чего неправильно делаю??? У кого есть какие-нибудь варианты или советы???
Листинг Unit-а:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type TLoadGrid = procedure (LoadFile: string; StringGrid: TStringGrid); stdcall;
var
Form1: TForm1;
LoadGrid : TLoadGrid;
DLLHandle: THandle;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DLLHandle:=LoadLibrary("LoadGridDLL.dll");
@LoadGrid:=GetProcAddress(DLLHandle,"GridLoad");
LoadGrid("Grid.txt",Form1.StringGrid1);
FreeLibrary(DLLHandle);
end;
end.
Листинг DLL:
library LoadGridDLL;
uses
SysUtils, StdCtrls, Dialogs, System, Printers, Grids;
{$R *.res}
procedure GridLoad(LoadFile: string; StringGrid: TStringGrid); stdcall;
var
LoadTextFile: TextFile;
i,j: integer;
TempCells: string;
begin
AssignFile(LoadTextFile,LoadFile);
Reset(LoadTextFile);
for i:=0 to (StringGrid.ColCount) do
for j:=0 to (StringGrid.RowCount) do
begin
Readln(LoadTextFile,TempCells);
StringGrid.Cells[i,j]:=TempCells;
end;
CloseFile(LoadTextFile);
end;
procedure GridSave(SaveFile: string; StringGrid: TStringGrid); stdcall;
var
SaveTextFile: TextFile;
i,j: integer;
begin
AssignFile(SaveTextFile,SaveFile);
Rewrite(SaveTextFile);
for i:=0 to (StringGrid.ColCount) do
for j:=0 to (StringGrid.RowCount) do
Writeln(SaveTextFile,StringGrid.Cells[i,j]);
CloseFile(SaveTextFile);
end;
exports
GridLoad,
GridSave;
begin
end.
← →
ssk (2004-04-02 09:38) [1]ShareMem забыл
← →
VMcL © (2004-04-02 10:35) [2]Боюсь, что ShareMem делу не поможет. Возможно, BPL спасут отца (бело)русской демократии.
← →
ssk (2004-04-02 10:53) [3]>VMcL © (02.04.04 10:35) [2]
Боюсь, что ShareMem делу не поможет.
только что не поленился поверить - без ShareMem не работает. с ShareMem - все ОК.
← →
VMcL © (2004-04-02 12:07) [4]>>ssk (02.04.04 10:53) [3]
Повезло. То, что код заработал сейчас, не значит, что он принципиально правильный.
← →
ssk (2004-04-02 12:13) [5]>VMcL
согласен
← →
Marat_D © (2004-04-02 16:47) [6]>> ssk, для всехчто за ShareMem? и где именно надо воспользоваться ShareMem?...Полазил по help-у и понял что это модуль, который надо подключить в uses перед модулем system
uses ...ShareMem, System,...;
Понятно, что надо использовать какие-то функциии из ShareMem (а может и ненадо). Я не имел дела с ShareMem расскажи, что нужно сделать, чтобы все работало нормально?
← →
VMcL © (2004-04-03 14:29) [7]>>Marat_D © (02.04.04 16:47) [6]
Просто перед самым первым модулем в uses проекта DLL, нужно вставлять ShareMem. Например, вместоuses
SysUtils,
Classes;
должно статьuses
ShareMem,
SysUtils,
Classes;
Сразу о плохом: для работы такой библиотеки потребуется BORLNDMM.DLL (в Delphi 6).
Но, ИМХО, см. [2].
← →
Marat_D © (2004-04-03 17:37) [8]>>VMcL
А как обойтись без BORLNDMM.DLL? Не будешь ты ее с собой всюду таскать… Может, кто сталкивался с этой проблемой [см. самое начало топика]. Может у кого-нибудь есть другие решения этой проблемы? Или алгоритмы реализации?
← →
VMcL © (2004-04-05 00:15) [9]>>Marat_D © (03.04.04 17:37) [8]
В надцатый раз повторяю:
BPL (package + F1)
Подойдёт?
← →
ssk (2004-04-05 09:27) [10]http://delphimaster.ru/news/
download link
http://www.delphipages.com/edit/count.cfm?ID=4166
по этой сслыке ищи ShareMemRep. используется так же как и ShareMem, но без таскания за собой borlndmm.dll
← →
VMcL © (2004-04-05 10:19) [11]>>ssk (05.04.04 09:27) [10]
Если мне не изменяет склероз, ShareMemRep можно использовать только, когда и exe-приложение и dll пишутся на Delphi.
← →
ssk (2004-04-05 11:51) [12]да
← →
ssk (2004-04-05 11:52) [13]хотя, именно вот сейчас я хочу провести эксперимент с C++bulder"ом и ShareMemRep. посмотрим, что получится... ;-)
← →
Marat_D © (2004-04-06 03:49) [14]>>ssk, VMcL
Чуваки спасибо за помощь...
>>ssk:
хотя, именно вот сейчас я хочу провести эксперимент с C++bulder"ом и ShareMemRep. посмотрим, что получится... ;-)
->Расскажешь что получится, может без ShareMemRep можно обойтись в C++bulder"e.
->В C++bulder"e, как и в Delphi плохо реализована работа с DLL (как мне кажется, может я и ошибаюсь).В VC++ она реализована лучше, но это только лишь мое мнение...
← →
Suntechnic © (2004-04-06 04:49) [15]В C++bulder"e, как и в Delphi плохо реализована работа с DLL...
Это всё-равно что "почти беременна" :)
В VC++ она реализована лучше, но это только лишь мое мнение...
Это всё-равно что "лучше беременна" :)
← →
ssk (2004-04-06 09:10) [16]>Marat_D © (06.04.04 03:49) [14]
->Расскажешь что получится
что могу сказать... ShareMemRep только для Delphi (см. диалог [11] и [12]). чтобы ДЛЛ работала и там и там без использования менеджера памяти, надо параметры передавать либо в Char, либо в ShortString. это вообще и в книгах написано и в комментариях мастеров ДЛЛ в Delphi и в Builder"е. вот такие дела. ;-)
← →
VMcL © (2004-04-08 19:48) [17]>>Marat_D © (06.04.04 03:49) [14]
>В C++bulder"e, как и в Delphi плохо реализована работа с DLL
>(как мне кажется, может я и ошибаюсь).
>В VC++ она реализована лучше, но это только лишь мое мнение...
Надо же, какие кривые руки у программистов из Borland и какие ровные у оных из Microsoft.
← →
panov © (2004-04-08 20:08) [18]borlndmm.dll. размер 25600.
Из-за такого размера копья ломать?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c