Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 12:04   #1
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию Текст в поток (Stream) и снова в текст

Как можно текст и RichEdit превратить в поток Stream для того чтобы записать в ини в виде потока и из потока превратить снова в текст. Просто текст очень большой может быть. А я хочу его записывать в виде маленькой строки. Запись будт идти в ини в этой процедуре

Код:
procedure TMain_Application.WriteChangeLang(LangSection: string);
var
  //âðåìåííàÿ ïåðåìåííàÿ äëÿ âûáîðêè âñåõ êîìïîíåíòîâ
  i, i1: Integer;
  //ñòðîêîâàÿ ïåðåìåííàÿ äëÿ ïîëó÷åíèÿ êàòàëîãà ñ exe
  ProgramPath: string;
begin
  if ComponentCount <> 0 then begin
    //Ïîëó÷àåì êàòàëîã ãäå ëåæèò çàïóùåííûé exe
    ProgramPath := ExtractFileDir(Application.ExeName);
    //Ãàðàíòèðîâàííî óñòàíàâëèâàåì ïîñëåäíèé ñèìâîë
    if ProgramPath[Length(ProgramPath)] <> '\' then
      ProgramPath := ProgramPath + '\';
    //Ïîäãîòàâëèâàåì èíè ôàéë
    LangIniFile:=TIniFile.Create(ProgramPath+'Ðåäàêòîð Libx\lang.ini');
    LangIniFile.WriteString(LangSection, name, Caption);
    for i:=1 to ComponentCount do begin
      if Components[i-1].ClassType = TButton then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TButton).Caption);
      if Components[i-1].ClassType = TLabel then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TLabel).Caption);
      if Components[i-1].ClassType = TEdit then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TEdit).Text);
      if Components[i-1].ClassType = TTabSheet then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TTabSheet).Caption);
      if Components[i-1].ClassType = TRadioButton then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TRadioButton).Caption);
      if Components[i-1].ClassType = TCheckListBox then
        if (Components[i-1] as TCheckListBox).Items.Count > 0 then
          For i1:=0 to (Components[i-1] as TCheckListBox).Items.Count-1 do
            LangIniFile.WriteString(LangSection,
              name+'-->'+Components[i-1].name+'-->Items-->Strings['+inttostr(i1)+']', (Components[i-1] as TCheckListBox).Items.Strings[i1]);
      if Components[i-1].ClassType = TListBox then
        if (Components[i-1] as TListBox).Items.Count > 0 then
          For i1:=0 to (Components[i-1] as TListBox).Items.Count-1 do
            LangIniFile.WriteString(LangSection,
              name+'-->'+Components[i-1].name+'-->Items-->Strings['+inttostr(i1)+']', (Components[i-1] as TListBox).Items.Strings[i1]);
      if Components[i-1].ClassType = TAction then
        LangIniFile.WriteString(LangSection,
          name+'-->'+Components[i-1].name, (Components[i-1] as TAction).Caption);
    end;
    LangIniFile.Free;
  end;
end;
Alexandr17-10 вне форума Ответить с цитированием
Старый 14.08.2013, 17:20   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Маленькой строкой не получится.

HEX
Код:
 // поток в текст
function BinaryStreamToText(Value: TStream):string;
var
  Text: string;
  Stream: TMemoryStream;
begin
  Result := '';
  if not Assigned(Value) then Exit;
  SetLength(Text, (Value.Size - Value.Position) * 2);
  if Length(Text) > 0 then
  begin
    if Value is TMemoryStream then
      Stream := TMemoryStream(Value)
    else
      Stream := TMemoryStream.Create;

    try
      if Stream <> Value then
      begin
        Stream.CopyFrom(Value, Value.Size - Value.Position);
        Stream.Position := 0;
      end;
      BinToHex(Pointer(Integer(Stream.Memory) + Stream.Position)^, PChar(Text),
               Stream.Size - Stream.Position);
    finally
      if Value <> Stream then
        Stream.Free;
    end;
  end;
  Result := Text;
end;

 // восстанавливает из текста, созданного BinaryStreamToText, в поток 
function ReadBinaryStreame(const S: string; Value: TStream):Integer;
var
  Text: string;
  Stream: TMemoryStream;
  Pos: Integer;
begin
  Result := 0;
  Text := S;
  if Text <> '' then
  begin
    if (Value is TMemoryStream) then
      Stream := TMemoryStream(Value)
    else
      Stream := TMemoryStream.Create;

    try
      Pos := Stream.Position;
      Stream.SetSize(Stream.Size + Length(Text) div 2);
      HexToBin(PChar(Text), Pointer(Integer(Stream.Memory) + Stream.Position)^,
               Length(Text) div 2);
      Stream.Position := Pos;
      if Value <> Stream then
        Value.CopyFrom(Stream, Length(Text) div 2);
      Result := Stream.Size - Pos;
    finally
      if Value <> Stream then
        Stream.Free;
    end;
  end
   else
  Result := 0;
end;
Base64
Код:
function StrToBase64(Buf: string): string;
function Base64ToStr(B64: string): string;
Вложения
Тип файла: zip Base64.zip (1.5 Кб, 14 просмотров)
Alter вне форума Ответить с цитированием
Старый 14.08.2013, 17:24   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Маленькой строкой не получится.
Можно сжать только упаковщиком. HEX и BASE64 только увеличат размер
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.08.2013, 17:28   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Увеличат, зато одной строкой) Сжатие строки, это как выберет способ. В DFM файлах почему то размер не мешает хранить там строки и картинки.
Alter вне форума Ответить с цитированием
Старый 14.08.2013, 17:40   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Можно использовать TStringStream и не заморачиваться со всякими кодированиями и перекодированиями.

Последний раз редактировалось Человек_Борща; 14.08.2013 в 17:45.
Человек_Борща вне форума Ответить с цитированием
Старый 14.08.2013, 19:05   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Увеличат, зато одной строкой)
Не понимаю термина "одной строкой". Ну интерпретирует отображающая программа некоторые коды как перевод каретки и строки. Ну и что?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.08.2013, 20:55   #7
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Я тут по эксперементировал
Код:
Для загрузки
if Components[i-1].ClassType = TRichEdit then begin
        strem:=TMemoryStream.Create;
          LangIniFile.ReadBinaryStream(LangSection,
          name+'-->'+Components[i-1].name,strem);
          (Components[i-1] as TRichEdit).Lines.LoadFromStream(strem);
        strem.Free;
      end;
Для записи
if Components[i-1].ClassType = TRichEdit then begin
        strem:=TMemoryStream.Create;
          (Components[i-1] as TRichEdit).Lines.SaveToStream(strem);
          strem.Seek(0, soFromBeginning);
          LangIniFile.WriteBinaryStream(LangSection,
          name+'-->'+Components[i-1].name,strem);
        strem.Free;
      end;
Ну правдо большой строкой записывает а так то что нужно
Alexandr17-10 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скопировать текст содержащийся в ячейке таблицы и вставить этот текст в место документа помеченное закладкой. LiliPOOtin Microsoft Office Word 3 17.04.2013 19:51
Сохранить битмап в поток System::IO::Stream bananasus Visual C++ 2 02.08.2012 22:43
Сохранить в текстовый файл текст из Memo и текст из нескольких Edit misher Общие вопросы Delphi 5 02.01.2011 15:37
Дан файл, содержащий текст, записанный строчными русскими буквами. Получить в др.файле тот же текст, develish151 Microsoft Office Word 4 05.05.2010 13:20
Как узнать какой текст выделен в текст поле mogul82 JavaScript, Ajax 2 02.11.2008 16:32