Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему "умирает" буффер при заполнении из массива, Экспорт в Excel через DDE 
:(
    Опции темы
cheska
Дата 3.4.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 30.3.2007

Репутация: нет
Всего: нет



Изучаю возможность работы с Excel через DDE
DDE использую так как несколько приложений работаеют с одним файлом Excel и скидывают туда ( и читают) данные по DDE,
да еще пользователь ручками корректируеттдельные листы.

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

Спецально ввел прогресбар и когда читаю txt файл (строка из 10 значений по 5-10 символов) то после 5000 записей сильно 
падает скорость заполнения буфера из массива.

В реальной жизни буду работать не с файлом а считывать в буфер стреницу ( или часть) целиком, формировать из нее массив
с которым буду работать и менять данные, а потом также через буфер массив скидывать на лист.

Но вот с буфером у меня проблеммы и как ускорить процесс мне не понятно. Подскажите пожалуйста так как данных на листе много....
Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DdeMan, ComCtrls;

type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    DdeClientConv1: TDdeClientConv;
    Button1: TButton;
    DdeClientItem1: TDdeClientItem;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 Arr1:OleVariant;
 Buffer: string;
 DataInFile:TextFile;
 WordsStr, ST1:TStringList;
 i1RecTXT: string;
 maxRow,I,J:integer;

begin
 {Считываем файл}
 try
  AssignFile(DataInFile,'D:\testin.txt');
  Reset(DataInFile); // открыть файл для чтения
 except
  ShowMessage('Не удалось открыть файл:');
 end;
 try
  {Формируем массив из TXT файла}
  WordsStr:=TStringList.create;
  while not EOF(DataInFile) do
   begin
    ReadLn(DataInFile,i1RecTXT); // считываем строку
    // так как в файле могут быть пустые строки то обрабатываем только строки проходящие контроль длинны
    if Length(i1RecTXT)>5 then WordsStr.Append(i1RecTXT);
   end;
  maxRow:=WordsStr.Count;
  Arr1:=VarArrayCreate([0,maxRow,0,10],varVariant);
  for I := 0 to maxRow - 1 do
   begin
    st1:=TstringList.Create;
    st1.Text:= stringReplace(WordsStr.Strings[i],',',#13#10,[rfReplaceAll]);//мы заменяем все "," на символы конца строки
    for J := 0 to st1.Count - 1 do Arr1[I,J]:=st1.Strings[J];
    st1.free;
   end;
  WordsStr.free;
  Label1.Color:=clGreen; // визуализация что данные получены и готовы к экспорту
  Label1.Caption:='файл считан';
  {Перегоняем массив в буфер}
  Buffer:='';
  ProgressBar1.Max:= maxRow;
  ProgressBar1.Step:=1;
  for I := 0 to maxRow do begin
    for J := 0 to 10 do begin
     Buffer:=Buffer+Arr1[I,J];
     if J<10 then Buffer:=Buffer+#9; // разделитель - табуляция
    end;
    if I < maxRow then Buffer:=Buffer+#10;  // разделитель - перевод строки;
    ProgressBar1.Position:= ProgressBar1.Position+ ProgressBar1.Step;
  end;
  {Экспортируем данные в Excel}
  if DdeClientConv1.SetLink('EXCEL', 'D:\[test001.xls]L002') and DdeClientConv1.OpenLink then
   begin
    try
     DDEClientItem1.DdeItem :='R1C1:R'+Inttostr(maxRow)+'C11';
     DDEClientConv1.PokeData(DDEClientItem1.DdeItem, PChar(Buffer));
    finally
     DDEClientConv1.Free;
    end;
   end;
 finally
  CloseFile(DataInFile);
 end;
 Label1.Color:=clBlue; // визуализация что данные получены и готовы к экспорту
 Label1.Caption:='файл экспортирован успешно';
 ProgressBar1.Position:=0;
end;

end.



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.