Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запись в файл


Автор: Anarhist 18.10.2006, 19:40
Как записать в файл без искажение, после записи в файл ставятся всяческие идентефикаторы и т. д..
"Привет"- Вот что получается при записи методом Write, мне вот нужно html страницу создать, а как я с такой записью это сделаю, как записать без добавлений и искажений?        smile  smile  smile 

Автор: Snowy 18.10.2006, 19:48
Значит как-то неправильно пишешь. Из всех способов выбрал единственный неправильный smile
Ну например, можно все строки добавить в TStringList, а потом вызвать его метод SaveToFile.

Автор: Anarhist 20.10.2006, 09:59
Я вынужден поять поднять тему, посколку этот глюк уже мешает правильной работе программы. Теперь при записи более сложных строк он подставляет страные символы которые мешают работе всей html страницы, например вот- 5.gerz {position: absolute ; left: 330px; top: 440px;} или  /<input name="MyButton" type="radio" class=gerz>, бред одним слововм. вот код который все это делает.
Код

library brc;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes;
  
type
   Trec = record
   html : array[0..100] of string[255];
    //Adders: string[60];
end;
var
  F : file of Trec;
  Wr : Trec;
  pos : integer;

{$R *.res}
function Save(Name,bg : string) : string;//Èìÿ ôóíêöèè
begin
   AssignFile(F, 'Project\index.html');//Ññûëêà íà îòêðûâàåòìûé ôàéë
      if not fileExists('Project\index.html') then//åñëè ôàéë
       begin
         Rewrite(F);
       end
       else begin
         Reset(F);
        end;
        Pos := 0;

        Wr.html[0] := '<html>';
        Wr.html[1] := '<style>';
        Wr.html[10] := '</style>';
        Wr.html[11] := '<head>';
        Wr.html[20] := '</head>';
        Wr.html[21] := '<body bgcolor="#'+bg+'">';
        Wr.html[22] := '<title>'+Name+'</title>';
        Wr.html[100] := '</html>';
            Write(F, Wr);
end;
function CreateRadioButton(Name,x,y : string) : string;//Èìÿ ôóíêöèè
begin
   AssignFile(F, 'Project\index.html');//Ññûëêà íà îòêðûâàåòìûé ôàéë
      Reset(F);
        Wr.html[2] := '.'+Name+' {position: absolute ; left: '+x+'px; top: '+y+'px;}';
        Wr.html[23] := '<input name="MyButton" type="radio" class='+Name+'>';
           Write(F, Wr);
end;
exports Save;
exports CreateRadioButton;
begin
end.

Две функции по форматированию html кодов...
Пробовал разные форматы, одно и тоже...

Автор: Hidrag 20.10.2006, 10:05
Попробуй для записи файлов использовать TFileStream, а не старый еще со времен DOS способ работы с файлами, или как посоветовал Snowy

Автор: Anarhist 20.10.2006, 10:07
Где достать инфоу о его исползовании?

Автор: Sansa 20.10.2006, 10:25
Ты неправильно записываешь. Попробуй вот это:
Код

library brc;
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
uses
  SysUtils,
  Classes;

type
   Trec = record
   html : array[0..100] of string[255];
    //Adders: string[60];
end;
var
  F : file of Trec;
  Wr : Trec;
  pos : integer;
{$R *.res}

{Подготовка тела страницы}
procedure PrepareHtml(var ARec: TRec);
begin
  if Assigned(ARec) then
    with  ARec do
    begin
      html[0] := '<html>';
      html[1] := '<style>';
      html[10] := '</style>';
      html[11] := '<head>';
      html[20] := '</head>';
      html[21] := '<body bgcolor="#'+bg+'">';
      html[22] := '<title>'+Name+'</title>';
      html[100] := '</html>';
    end;
end;

function Save(Name,bg : string) : string;//Eiy ooieoee
var
  I: integer;
begin
   AssignFile(F, 'Project\index.html');//Nnueea ia ioe?uaaaoiue oaee
   if not fileExists('Project\index.html') then//anee oaee
   begin
     Rewrite(F);
   end
   else
   begin
     Reset(F);
   end;
   Pos := 0;
   PrepareHTML(Wr);  // подготовка данных
   {!!! Обрати внимание! Последовательно выводим строку за строкой, а не всю структуру разом
   Иначе, конечно будет записываться служебная информация
   }
   for I:= Low(Wr.html) to High(Wr.html) do
     Write(F, Wr.html[I]);
end;
function CreateRadioButton(Name,x,y : string) : string;//Eiy ooieoee
begin
   AssignFile(F, 'Project\index.html');//Nnueea ia ioe?uaaaoiue oaee
      Reset(F);
        Wr.html[2] := '.'+Name+' {position: absolute ; left: '+x+'px; top: '+y+'px;}';
        Wr.html[23] := '<input name="MyButton" type="radio" class='+Name+'>';
           Write(F, Wr);
end;
exports Save;
exports CreateRadioButton;
begin
end.

Автор: Hidrag 20.10.2006, 10:28
Anarhist, http://forum.vingrad.ru/section-557/module/vingradfaq/act-module.html

Автор: Anarhist 20.10.2006, 10:55
Куча ошибок, почте все исправил, остались две, тут 
Код

if Assigned(ARec) then

И тут 
Код

for I:= Low(Wr.html) to High(Wr.html) do
     Write(F, Wr.html[I]);

Обе Несовместимость типов, с Assigned не работал поэтому как исправить не знаю...

Автор: Sansa 20.10.2006, 12:02
Можешь удалить строку с Assigned (она проверяет что экземпляр создан). Поменяй декларацию файла на 
var
  F : TextFile; 
и все

Автор: Romikgy 20.10.2006, 13:32
Anarhist, если VCL можно юзать бери 
Цитата(Snowy @  18.10.2006,  18:48 Найти цитируемый пост)
Ну например, можно все строки добавить в TStringList, а потом вызвать его метод SaveToFile.

проще на порядки

Автор: Alexeis 20.10.2006, 13:44
Цитата(Anarhist @  20.10.2006,  10:07 Найти цитируемый пост)
Где достать инфоу о его исползовании? 

Кратко основные методы и свойства я описывал здесь 
http://forum.vingrad.ru/index.php?showtopic=110699&hl=tfilestream

Автор: AugMaster 21.10.2006, 21:49
дедовским досовским надежным способом
F:File of byte;
каждую строку прогоняешь в цикле 
for tmp1:=1 to length(st{строка на запись}) do begin b{byte}:=ord(st[tmp1]);write(f,b);end;
b:=13;{перевод строки, "Enter"}
write(f,b);

и все.
а твоя запись TRec в любом случае в начале строки вбивает байт длины этой строки...отсюда непонятный символ  на старте

Автор: Демо 22.10.2006, 02:08
Anarhist, 

Ты привел код библиотеки. А обратил внимание на то, что у тебя в комментариях написано в самом начале?

Автор: Anarhist 22.10.2006, 06:46
Чето я глюконул, подумал что TStringList это vcl, спать надо больше... smile тока вот опять я немогу найти ничего про него!

Автор: Anarhist 22.10.2006, 07:11
И еще немного не понятно как записывать в него- 
Код

writ.AddStrings('Привет');

И вылетает ошибка что мол несовместимость типов Tstring и String... Как правильно записывать?

Автор: kostas 22.10.2006, 14:15
Код

...
var t: TStringList;
...
  t:=TStringList.Create;
  try
   t.Add('text');
   ...
   t.SaveToFile('path');
  finally
   t.Free;
  end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)