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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 22:46   #11
robt
Заблокирован
 
Регистрация: 21.06.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Странно, но это работает....
потому, что все по госту
robt вне форума Ответить с цитированием
Старый 31.03.2012, 04:28   #12
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Эх, не стоило мне спросонья отвечать. Как это я пропустил, что у тебя таблица строк.

Во-первых, в Delphi для загрузки строк есть готовая функция:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := LoadStr(7);
end;
Во-вторых, в отличие от других типов ресурсов, где идентификатор ресурса совпадает с указаным в *.rc файле, строковые ресурсы упаковываются в "пачки".

Посмотри:
http://www.transl-gunsmoker.ru/2008/...post_9202.html

По сути, для загрузки строки номер 7 тебе нужен ресурс номер 7 div 16 + 1 (т.е. 1), а в нём - позиция 7 and 15 (т.е. 7).

В третьих, для загрузки ресурса по ID у TResourceStream есть перегруженный конструктор. А AV вылетал потому что параметр имел тип строки, а не PChar.

Итого, если бы ты захотел написать свой код для загрузки строк - ты бы написал что-то такое:
Код:
function LoadStrExample(const ID: Integer): String;
var
  RS: TResourceStream;
  SS: TStringStream;
  Len: Word;
  X: Integer;
begin
  // Bucket
  RS := TResourceStream.CreateFromID(HInstance, ID div 16 + 1, RT_STRING);
  try

    // ID
    RS.ReadBuffer(Len, SizeOf(Len));
    for X := 0 to (ID and 15) - 1 do
    begin
      RS.Position := RS.Position + Len * SizeOf(WideChar);
      RS.ReadBuffer(Len, SizeOf(Len));
    end;

    // Copy str
    SS := TStringStream.Create('', TEncoding.Unicode);
    try
      SS.CopyFrom(RS, Len * SizeOf(WideChar));
      Result := SS.DataString;
    finally
      FreeAndNil(SS);
    end;

  finally
    FreeAndNil(RS);
  end;
end;
Писать свой код имеет смысл в тех случаях, когда ты либо хочешь указывать явно идентификатор языка строки, либо у тебя очень большая строка (подпрограммы последних версий Delphi ограничены 4096 символами, а старые Delphi - 1024, в то время как ресурсная строка может быть размером в 65к символов (или байт? Не уверен)).

В остальных случаях нужно использовать LoadStr или (что лучше) - resourcestring.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.03.2012, 11:59   #13
robt
Заблокирован
 
Регистрация: 21.06.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Эх, не стоило мне спросонья отвечать.
ыхыхы,стандартная форумская отмазка,спросонья,спохмелья,экран сбликовал ...
признайся что плохо погуглил
robt вне форума Ответить с цитированием
Старый 31.03.2012, 12:32   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
ыхыхы,стандартная форумская отмазка,спросонья,спохмелья,экран сбликовал ...
признайся что плохо погуглил
не у всех время московское.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.03.2012, 13:47   #15
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

И некоторым удобно спать и работать, когда захочется
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.03.2012, 19:46   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
По сути, для загрузки строки номер 7 тебе нужен ресурс номер 7 div 16 + 1 (т.е. 1), а в нём - позиция 7 and 15 (т.е. 7).
В чем смысл деления 7 на 17? Вообще зачем это?
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SysListView32 выдергивание текста StartMis Общие вопросы Delphi 5 16.11.2011 22:59
Постоянное выдергивание из базы CodeNOT JavaScript, Ajax 0 01.07.2011 14:20
Случайное выдергивание из базы CodeNOT PHP 1 30.05.2011 11:56
Выдергивание слов из STRING kardinal94 Общие вопросы Delphi 1 30.07.2010 22:21