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


Автор: Alex 9.4.2004, 21:44
 Для общего пользования выкладывается модуль работы с ресурсами в PE файлах, который корректно работает во всех версиях Windows. За основу был взят модуль работы с ресурсами компании Mathias Rauen, http://www.madshi.net.

Возможности:
1. Извлечение иконок из ресурсов без потери их цветовой гаммы и с сохранением всех вложенных иконок.
2. Добавление нового ресурса
3. Изменение существующего ресурса
4. Удаление ресурса
5. Работа с ресурсами различных языков
и т. д.

Работа над модулем будет продолжена. Свежую версию, вы всегда можете скачать по адресу http://alex-co.org/files/delphi/acWorkRes.rar 

Автор: p0s0l 11.4.2004, 15:05
Через пару дней этот топик скатится вниз и уйдёт в небытие. Кто-то предлагал идею сделать типа архива исходников или что-то в этом роде. Но заглохло пока. Если ещё пару человек выложат какие-нибудь модули или исходники, можно будет создать отедельную тему и её закрепить, а там оставлять ссылки на сами темы, чтобы не было "месива"...


Автор: Alex 11.4.2004, 17:13
Могу стать Модератор нового раздела

Автор: bartram 11.4.2004, 17:28
alex-co, скинь примерчик работы с модулем please, очень надо !!! exclamation.gif exclamation.gif exclamation.gif

Автор: RA 11.4.2004, 17:34
Цитата(p0s0l @ 11.4.2004, 12:05)
Через пару дней этот топик скатится вниз и уйдёт в небытие. Кто-то предлагал идею сделать типа архива исходников или что-то в этом роде. Но заглохло пока. Если ещё пару человек выложат какие-нибудь модули или исходники, можно будет создать отедельную тему и её закрепить, а там оставлять ссылки на сами темы, чтобы не было "месива"...

p0s0l Ты главное пробей эту тему, а там народ сам потянется исходники выкладывать, лично я уже давно мечтаю выложить несколько исходнико о каторых наверняка многие мечтают (судя по топикам форума).

Автор: Alex 11.4.2004, 17:36
Цитата(bartram @ 11.4.2004, 18:28)
alex-co, скинь примерчик работы с модулем please, очень надо !!! exclamation.gif  exclamation.gif  exclamation.gif

А с каким именно ресурсом нужен пример работы?

Автор: bartram 11.4.2004, 17:37
Цитата
А с каким именно рессурсом нужен пример работы


С ресурсом типа string, bitmap !!!

Автор: Alex 11.4.2004, 18:18
Цитата(bartram @ 11.4.2004, 18:37)
Цитата
А с каким именно рессурсом нужен пример работы


С ресурсом типа string, bitmap !!!

Со строками пока сам не разобрался, а с Bitmap все просто. Если хочешь с заданием языка, то так:
Код
var
 hUpdateRes: THandle;
begin
 hUpdateRes:= BeginUpdateResourceW('Путь к файлу', FALSE);
 if not LoadBitmapResourceW(hUpdateRes, 'Имя ресурса', 1049,'e:\Temp\123.bmp') then
   showMessage('');
 EndUpdateResourceW(hUpdateRes, FALSE);

Без указания языка:
Код
var
 hUpdateRes: THandle;
begin
 hUpdateRes:= BeginUpdateResourceW('Путь к файлу', FALSE);
 notLang:= True;
 try
   if not LoadBitmapResourceW(hUpdateRes, 'Имя ресурса', 0,'e:\Temp\123.bmp') then
     showMessage('');
 finally
   notLang:= False;
 end;
 EndUpdateResourceW(hUpdateRes, FALSE);

Добавлено @ 18:25
У кого есть пример подмены строковых ресурсов с помощью стандартной функции UpdateResource просьба сообщить. Есть пример на С но моих знаний С не достаточно чтобы в нем разобраться может кто поможет.

Автор: Alex 11.4.2004, 18:27
Вот и сам пример на С

Автор: bartram 11.4.2004, 20:07
alex-co, у меня есть прога которая конвертирует из Си в Pas через пару дней выложу может поможет !!

Автор: Alex 18.4.2004, 00:23
Обновление:
-Добавлена функция "StringToPWide" - Преобразование String в PWideChar
- Исправлена ошибка в функция "GetNameIcon"
- Добавлена функция "SaveIconToDiscW" - Сохранение иконки

Адрес загрузки старый

Автор: Alex 17.7.2004, 18:26
Обновление:
- Добавлена функция "PWideToString" - Преобразование PWideChar в String.
- Исправлена ошибка в функция "SaveIconToDiscW", которая возникала на некоторых системах семейства Win9x.

Адрес загрузки старый

Автор: Ilya26 20.7.2004, 11:25
alex-co, можешь привести пример работы с jpg ресурсами а также с rtf файлами.
Очень, очень надо !!!

Заранее спасибо.
Добавлено @ 11:26
alex-co, можешь привести пример работы с jpg ресурсами а также с rtf файлами.
Очень, очень надо !!!

Заранее спасибо.

Автор: Alex 20.7.2004, 11:57
Что именно вам нужно запись, чтение или что-то еще?

Автор: SlaUr 20.7.2004, 14:28
Цитата
Через пару дней этот топик скатится вниз и уйдёт в небытие. Кто-то предлагал идею сделать типа архива исходников или что-то в этом роде. Но заглохло пока.


Вроде бы ведь сделали общий топик "арсенал форумистов" :
http://forum.vingrad.ru/index.php?showtopic=21411

Почему бы не выложить туда?


p.s. У меня лично этот топик показывается в разделе "Важные темы"

Автор: Alex 20.7.2004, 14:39
Цитата(SlaUr @ 20.7.2004, 15:28)
Цитата
Через пару дней этот топик скатится вниз и уйдёт в небытие. Кто-то предлагал идею сделать типа архива исходников или что-то в этом роде. Но заглохло пока.


Вроде бы ведь сделали общий топик "арсенал форумистов" :
http://forum.vingrad.ru/index.php?showtopic=21411

Почему бы не выложить туда?


p.s. У меня лично этот топик показывается в разделе "Важные темы"

Да если ты внимательно почитаешь, арсенал форума то увидишь, что этот топик там самый первый.

Автор: Ilya26 21.7.2004, 16:04
alex-co, Желательно бы и запись, и чтение.
(запись в другой exe-файл)

Автор: Alex 21.7.2004, 21:59
Обновление:
- Добавлена функция "LoadFileResourceW" - Функция записи файла в ресурсы.
- Добавлена функция "LoadFileResource" - Функция записи файла в ресурсы без задания языка.
- Добавлена функция "SaveFileResourceW" - Функция извлечение файла из ресурсов.
- Добавлена функция "SaveFileResource" - Функция извлечение файла из ресурсов без задания языка.
- Добавлена функция "SaveFileToDiscW" - Сохранение ресурса ввиде файла на диск.
- Добавлена функция "LoadFileToResourceW" - Сохранение ресурса в виде файла на диск.

Адрес загрузки старый

Автор: Alex 21.7.2004, 22:11
Ilya26 Значит так, для добавления файла в ресурс воспользуйся функцией:
Код
function LoadFileToResourceW(exeFile, type_, name, aFile: PWideChar): BOOL; stdcall;
// Сохранение ресурса в виде файла на диск
// exeFile - Путь к файлу, в ресурсы которого загружается файл файл
// type_   - Тип ресурса (Большими буквами)
// name    - Имя ресурса (Большими буквами)
// aFile   - Путь к файлу, который будет грузиться в ресурс
// LoadFileToResourceW('e:\Temp\Project1.exe', 'JPEG', 'MYJPEG', 'e:\Temp\Untitled-21.jpg')

Для сохранения файла на диск воспользуйся функцией:
Код
function SaveFileToDiscW(exeFile, type_, name, aFile: PWideChar): BOOL; stdcall;
// Сохранение ресурса ввиде файла на диск
// exeFile - Путь к файлу, в котором находиться файл
// type_   - Тип ресурса (Большими буквами)
// name    - Имя ресурса (Большими буквами)
// aFile   - Путь к файлу для сохранения ресурса
// Пример использования:
// SaveFileToDiscW('e:\Temp\Project1.exe', 'JPEG', 'MYJPEG', 'e:\Temp\Untitled-21.jpg')


Для загрузки Jpg файла в Image сделай
Код
procedure LoadJPEGFromRes(Exe, JPEG: string; ThePicture: TPicture);
var
 hExe     : Cardinal;
 Stream: TResourceStream;
 JPEGImage: TJPEGImage;
begin
 hExe:= LoadLibrary(PChar(Exe));
 Stream:= TResourceStream.Create(hExe, JPEG,'JPG');
 JPEGImage:= TJPEGImage.Create;
 try
   JPEGImage.LoadFromStream(MemStream);
   ThePicture.Assign(JPEGImage);
 finally
   JPEGImage.Free;
   Stream.Free;
 end;
end;

Если тебе нужно загрузить из самого себя, то напиши
Код
LoadJPEGFromRes(ParamStr(0), 'MYJPEG', Image1.Picture);

Если тебе нужно загрузить из другого файла
Код
LoadJPEGFromRes('Путь к файлу', 'MYJPEG', Image1.Picture);


Для загрузки Rtf
Код
function LoadRTFFromRes(Exe, RTF: string): AnsiString;
var
 hExe     : Cardinal;
 Stream: TResourceStream;
begin
 hExe:= LoadLibrary(PChar(Exe));
 Stream:= TResourceStream.Create(hExe, RTF, 'RTF');
 try
   SetLength(Result, Stream.Size);
   Stream.Read(Result[1], Length(Result));
 finally
   Stream.Free;
 end;
end;

Автор: Anderson 31.8.2004, 18:56
Подключаю модуль, а у меня выходи ошибка: "Не найден файл acWorkRes.dcu" Где его достать-то?

Автор: Alex 31.8.2004, 22:56
Цитата(Anderson @ 31.8.2004, 19:56)
Подключаю модуль, а у меня выходи ошибка: "Не найден файл acWorkRes.dcu" Где его достать-то?

Читаем самое первое сообщение в этой теме

Автор: Alex 26.11.2004, 21:01
 Обновление:
- Были сделаны все изменения, которые сделал разработчик madRes в версии 1.0h.

Адрес загрузки старый  

Автор: Budy 3.7.2005, 15:16
Alex, рулишь, чувак!
Пользуюсь твоей процей LoadFileToResourceW, а вот объясни как теперь удалить лишние... smile

Автор: Alex 3.7.2005, 19:03
Цитата(Budy @ 3.7.2005, 16:16)
Alex, рулишь, чувак!
Пользуюсь твоей процей LoadFileToResourceW, а вот объясни как теперь удалить лишние...

Если без понтов и четко объяснишь, что тебе нужно, то может и помогу...

Автор: Budy 4.7.2005, 06:20
Alex, да какие понты, просто настроение было норм.
Короче, спасибо тебе за столь удобный в использовании модуль, вот.
Дело вот в чем: допустим в ресурсе (.exe) уже имеется какой-нить файл-ресурс, и мне его надо удалить.
И еще вопрос, как можно узнать весь список файлов-ресурсов в ресурсе.
ЗЫ.Ну каламбур, ресурс в ресурсе smile

Автор: Alex 4.7.2005, 12:01
Писал на вскидку, без проверки:

Код
function DeleteResourceW(exeFile, type_, name: PWideChar; language: word): BOOL; stdcall;
// Eдаление ресурса
// exeFile - Путь к файлу, из ресурсов которого удаляется файл
// type_   - Тип ресурса (Большими буквами)
// name    - Имя ресурса (Большими буквами)
var
  hUpdateRes: THandle;
begin
  Result:= False;
  hUpdateRes:= BeginUpdateResourceW(exeFile, False);
  if hUpdateRes <> 0 then if UpdateResourceW(hUpdateRes, type_, name, language, nil, nil) then
    Result:= EndUpdateResourceW(hUpdateRes, False);
end;


Смысл в том, что если функции UpdateResourceW указать нулевой размер данных, то ресурс удаляется

Автор: Budy 6.7.2005, 06:20
Alex, сэнк. Ну вот пора бы и обновить версию smile

Автор: Budy 11.8.2005, 19:59
А как узнать весь список всех ресурсов в файле?

Автор: Kondragor 14.9.2005, 22:35
У меня почему-то перестал работать модуль. Просто ни с того, ни с сего взял и перестал. Когда это произошло не знаю так как заметил не сразу, поэтому и сказать из-за чего это произошло не могу. Переставлял Delphi7, пробовал с чистой, без других компонентов, Delphi в чистом проекте все равно не работает. Просил друга - у него все пашет. Что и делать не знаю - пользовался одной единственной функцией SaveIconToDiscW, но она очень нужна для программы. Возможно кто-нибудь знает из-за чего это может происходить или хотя бы подскажите плиз альтернативный способ извлечения иконки из exe,dll и сохранение ее на диск, хотя бы 16*16 но не меньше 32bit?

Автор: Alex 14.9.2005, 23:32
Подготовь демо проект, в который включи exe или dll, из которого ты пытаешься вытащить ресурс.

Автор: Kondragor 14.9.2005, 23:43
Прошу http://www.kondragor.nm.ru/test.rar

Автор: Alex 14.9.2005, 23:53
Не компилируя тестовый проект, запустил его и у меня все спокойно достали.

Автор: SergeBS 15.9.2005, 10:54
Kondragor
Resource Hacker
Из exe/dll - иконки выдирает. редактировать и т.п. - не пробовал.
Сходи еще на download.ru - там наверняка тоже есть такое.
Добавлено @ 11:02
Kondragor
Вдогонку
Resource Hacker 3.4.0.79 - 24.03.2002 - в архиве rar - 450 K. НО быстро выслать не обещаю - отпуск, однако.

Автор: Alex 15.9.2005, 17:41
SergeBS, а немного тему почитать и понять, что человеку это программно нужно сделать...

Автор: Guest 7.10.2005, 05:14
Хочу кое что заметить. Во-первых, Alex, измени код правильно, ошибка кода в топике
Код
function DeleteResourceW(exeFile, type_, name: PWideChar; language: word): BOOL; stdcall;    
// Eдаление ресурса    
// exeFile - Путь к файлу, из ресурсов которого удаляется файл    
// type_   - Тип ресурса (Большими буквами)    
// name    - Имя ресурса (Большими буквами)    
var    
  hUpdateRes: THandle;    
begin    
  Result:= False;    
  hUpdateRes:= BeginUpdateResourceW(exeFile, False);    
  if hUpdateRes <> 0 then if UpdateResourceW(hUpdateRes, type_, name, language, nil, [color=red]nil[/color]) then    
    Result:= EndUpdateResourceW(hUpdateRes, False);    
end;

Во-вторых, обнови уже свой файл в инете, а то вот классную функцию дописал, а в модель не добавил smile
Ну и в-третьих: может все же кто-нить подскажет как узнать список всех ресурсов в файле?

Автор: Alex 7.10.2005, 07:09
как только будет время займусь. если очень не терпится, кто мешает сделать вам это самостоятельно?

Автор: mefik 1.12.2005, 16:50
А как стандартный тип ресурса использовать?
Например RT_VERSION

Пробовал StringToPWide(RT_VERSION)
нифига не получается....

Код

    hRes := BeginUpdateResourceW('temp.exe', False);
    GetResourceW(hRes, StringToPWide(RT_VERSION), '1', 1049, P, C);
    if P <> nil then ShowMessage(PWideToString(PWideChar(P))) else ShowMessage('error');
    EndUpdateResourceW(hRes, True);


Стандартной функцией VerQueryValue получается, но мне надо после считывания, еще изменить пару строчек.
просто VS_VERSION_INFO блок, единственный, который upx не упаковывается...

Автор: allx 19.4.2006, 00:10
Alex
Расскажите плиз как достать и изменить ну например строку в екзешнике используя данный модуль... код следующий:

Код

procedure TForm1.FormShow(Sender: TObject);
var
  fn: string;
  hUpdateRes: THandle;
  buffer: array[0..4097] of byte;
  pbuffer: pointer;
  bufsize:Cardinal;
  pw: pwidechar;
begin
  OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
  if OpenDialog1.Execute then begin
     if FileExists(OpenDialog1.FileName) then begin
        fn:=OpenDialog1.FileName;
        hUpdateRes:= BeginUpdateResourceW(StringToPWide(fn), FALSE);
        GetResourceW(hUpdateRes, PWideChar(RT_STRING),'65', $0409, pbuffer, bufsize);
        EndUpdateResourceW(hUpdateRes, FALSE);
     end;
  end;
end;


Ссылку на буффер функция не возвращает, размер тоже.  Я вот еще не уверен, что за Name, третьий параметр GetResourceW(). Я правильно полагаю что это имя ветки? 

Автор: Alex 19.4.2006, 17:34
allx, я скажу так, как доставать и изменять строки хранящиеся в ресурсах я не знаю smile  

Автор: allx 19.4.2006, 21:17
Alex
Чьерт )) Как достать строку я более-менее разобрался. Скорее менее чем более. Итак.

Код

Procedure TForm1.RenameResourceStrings(FileName: string);
var
  hUpdate : THandle;
  hMui : HMODULE;
  Data : WideString;
  Data2: String;
  ResInfo : HRSRC;
  ResData : HGLOBAL;    
  Adr : Pointer;
  Size : DWORD;
  b: boolean;
  li:TListItem;
  ii, i: integer;
  ResNames: TStrings;
  function enumResNamesProc(module: HMODULE; restype, resname: PChar; list: TStrings): Integer; stdcall;
  begin
   if HiWord(dword(resname)) <> 0 then
     list.Add(resname)
   else
     list.Add(inttostr(dword(resname)));
   Result := 1;
  end;
begin
  hMui := LoadLibraryEx(PAnsiChar(FileName),0,LOAD_LIBRARY_AS_DATAFILE);
  if hMui = 0 then Exit;
  ResNames:=TStringList.Create;
  EnumResourceNames(hMui, RT_STRING, @enumResNamesProc, dword(ResNames));
  for i:=0 to ResNames.Count-1 do begin
    li:=ListView1.Items.Add;
    li.Caption:=ResNames[i];
    ResInfo := FindResource(hMui, pansichar(strtoint(ResNames[i])), pansichar(RT_STRING));
    ResData := LoadResource (hMui, ResInfo);
    Adr := LockResource (ResData);
    Size := SizeofResource (hMui, ResInfo);
    SetLength(Data, Size div 2);
    CopyMemory (@Data[1], Adr, Size);
    data2:='';
    for ii := 1 to length(data) do begin
        if ord(Data[ii])<30 then
           data2:=data2+'[0x' + IntToHex(ord(Data[ii]),2)+']'
        else data2:=data2+data[ii];
    end;
    li.SubItems.Add(Data2);
  end;
  ResNames.Free;
  FreeResource(ResData);
  FreeLibrary(hMui);
end;


Код теперь работает. Остается открытым вопрос, как изменить строки...  И почему парсинг строковых ресурсов во всяких PE Explorer, ResHacker, XN ResourceEditor, Restorator и иже с ними мягко говоря отличается от того что получается  у меня.... 

Автор: allx 19.4.2006, 22:39
Народ, давайте вместе добьем эти несчастные строки... имхо будет хорошим дополнением к AcWorkRes ))

 c форматом итоговых строк разобрался - 
1) 1 байт размера элемента строки
2) строка соотв. размера
3) 1 байт размера элемента строки
4) строка соотв. размера
итд 

Автор: allx 20.4.2006, 21:50
ну я собсно разобрался в этой канители.  как отлажу код - отпишусь наверное. 

обновлять ресурсы оказалось довольно просто:

Код

    hMui:=BeginUpdateResource(PAnsiChar(FileName),true);
    UpdateResourceW(hMui,pwidechar(RT_STRING),pwidechar(strtoint(ResNames[i])),1033,@Data,Size);
    EndUpdateResource(hMui,false);
 

Автор: Budy 13.6.2006, 05:47
Alex, и все же ждем процедуры "Show_List_Of_All_Resources_In_File" smile 

Автор: Dino99rus 4.4.2007, 21:45
 LoadFileToResourceW исполбзую эту функцию все ок.
Но вот с использованием SaveFileToDiscW не получаеться. Он не создает файл из ресурса, а вообще как после LoadFileToResourceW загрузить файл в мемо. Не понимаю объеснити плиз

Автор: Dino99rus 5.4.2007, 16:56
Все броблему решил smile 

Автор: Dino99rus 5.4.2007, 22:28
Народ все хорошо получается. Запись в ехе файл и сохранение этих файлов на диск. 
Код

LoadFileToResourceW('test\project1.exe', 'RCDATA', 'MYTEST', 'test\new.tes');


Код

SaveFileToDiscW('test\Project1.exe', 'RCDATA', 'MYTEST','D:\new.txt');


Плиз, подскажите как можно не сохраняя  на диск файла, а сразу его загрузить например в МЕМО. Пожалусто подскажите

Автор: Alkash 6.4.2007, 10:04
Сохраняй в поток-)

Автор: Dino99rus 6.4.2007, 15:40
Да ты прав спасибо.
Все ок... (глупые вопросы здаю smile )

Автор: karlos34 18.11.2007, 17:04
Может немного туповатым покажется вопрос, но: используя LoadFileToResourceW добавляю в библиотеку картинку. вроде все ок, но прога, которая использует картинки из этой библиотеки не может подключить эту картинку. в ресхакере открываю - вроде все есть, НО: когда добаляю картинку (нужно заменить старую на новую) - не заменяет, а добавляет новый тип ресурса. короче вот часть кода:
Код

procedure TMain.ChangeImageExecute(Sender: TObject);
var namefile:string;  
    typeres:string;   
    nameres:string;   
    nameimg:string;  
begin
if OpenPictureDialog1.Execute then
begin
nameimg:=OpenPictureDialog1.FileName;
namefile:=(ExtractFilePath(Application.ExeName)+'Images.dll');
typeres:='Bitmap';
case typ of
1:nameres:='TDEVICE';
2:nameres:='TSWITCH';
3:nameres:='THUB';
4:nameres:='TTERMINATOR';
5:nameres:='TMARSH';
6:nameres:='TPC';
7:nameres:='TMULPC';
8:nameres:='TTELEGRAF';
9:nameres:='TFAX';
10:nameres:='TFONE';
11:nameres:='TSERVER';
12:nameres:='TCONNECT';
13:nameres:='TUSELUPR';
14:nameres:='TUSELNUPR';
15:nameres:='TUSELAVT';
16:nameres:='TOMS';
17:nameres:='TSECNET';
18:nameres:='TFIRNET';
19:nameres:='TFORNET';
20:nameres:='TMOST';
21:nameres:='TTHIRREP';
22:nameres:='TSECREP';
23:nameres:='TFIRREP';
24:nameres:='TFORREP';
25:nameres:='TMAGIST';
26:nameres:='TPOVTOV';
27:nameres:='THUBOV';
30:nameres:='TTRANS';
31:nameres:='TLINE';
32:nameres:='TPORTS';
33:nameres:='TPORTITEM';
34:nameres:='TPORT';
end;
//ShowMessage(namefile);
//ShowMessage(typeres);
//ShowMessage(nameres);
//ShowMessage(nameimg);
LoadFileToResourceW(StringToPWide(namefile),StringToPWide(typeres),StringToPWide(nameres),StringToPWide(nameimg));
end;
end;

Нужно сделать так, что б прога заменяла картинку в библиотеке по ее типу ресурса и имени.
в результате вот что в библиотеке

Автор: karlos34 18.11.2007, 22:09
понял в чем дело: моя прога работает с рисунками типа Bitmap и типом информации (Data type) Bitmap. а когда я добавляю рисунок - тип рисунка - Bitmap, а тип данных - Bitmap image. но от этого не легче... помогите кто знает как решить проблемму.

Автор: my666 18.12.2007, 15:41
кто-нить объяснит как работать со строковыми ресурсами типа RT_String?

Автор: Alexeis 18.12.2007, 21:12
Цитата(my666 @  18.12.2007,  15:41 Найти цитируемый пост)
кто-нить объяснит как работать со строковыми ресурсами типа RT_String? 

  Работать в смысле заменять или просто создавать и использовать?

Автор: fgn1 11.1.2008, 17:19
Кто-нибудь, помогите решить проблему.
Есть файл без расурсов, соответственнно без секции ресурсов. Надо запихнуть туда иконку.
Секция как я понял, автоматически не создаётся (сложно?). Даже если секция присутствует, необходимо создать группу иконок... вобщем  smile как всё это сделать...
Заранее спасибо

Автор: DelphiExpert1 17.5.2010, 15:03
Небольшой модуль для работы со строками:
Код

unit stringwork;

interface
function InversionString(Sx : string) : string;
function LTrimUnChar(UnChar , Sx : string) : string;
function RTrimUnChar(UnChar , Sx : string) : string;
function AllTrimUnChar(UnChar , Sx : string) : string;
function CountWord(UnChar , Sx : string) : integer;



implementation
{Инвертирует строку}
function InversionString(Sx : string) : string;
Var
  i : integer;
begin
  Result:=Sx;
  if Length(Sx)>0 then begin
     Result:='';
     for i:=Length(Sx) downto 1 do
      begin
        Result:=Result+Sx[i];
     end;
  end;
end;

{Удаляет НЕсимволы слева}
function LTrimUnChar(UnChar , Sx : string) : string;
//UnChar - строка разделителей(не символов). Аналог множества
//Sx - входная строка
Var
  YesExit : byte;
begin
  Result:=Sx;
  if (length(Sx)>0) and (length(UnChar)>0) then begin
     YesExit:=0;
     while YesExit<=0 do
      begin
        if POS(Result[1],UnChar)>0 then begin
           Delete(Result,1,1);
        end
        else begin
           YesExit:=2;
        end;
        if length(Result)<=0 then YesExit:=1;
     end;
  end;
end;

{Удаляет НЕсимволы справа}
function RTrimUnChar(UnChar , Sx : string) : string;
//UnChar - строка разделителей(не символов). Аналог множества
//Sx - входная строка
begin
  Result:=InversionString(Sx);
  Result:=LTrimUnChar(UnChar,Result);
  Result:=InversionString(Result);
end;

{Удаляет НЕсимволы слева и справа}
function AllTrimUnChar(UnChar , Sx : string) : string;
//UnChar - строка разделителей(не символов). Аналог множества
//Sx - входная строка
begin
  Result:=LTrimUnChar(UnChar,Sx);
  Result:=RTrimUnChar(UnChar,Result);
end;

//Определяет кол-во слов в строке
function CountWord(UnChar , Sx : string) : integer;
//UnChar - строка разделителей(не символов). Аналог множества
//Sx - входная строка
var
  InWord : byte;
  i : integer;
begin
  Result:=0;
  InWord := 0;
  i:=0;
  while i<length(Sx) do
   begin
    i:=i+1;
    if POS(Sx[i],UnChar)<=0 then begin
       if InWord<=0 then Result:=Result+1; //переход на начало слова
       InWord:=1; //Мы внутри слова
    end
    else begin
       InWord:=0; //Мы снаружи слова
    end;
  end;
end;
end.

Автор: simsmann 3.2.2011, 21:47
Не работает приведенный код по выгрузке jpg из ресурса допустим в Image

Код

procedure LoadJPEGFromRes(Exe, JPEG: string; ThePicture: TPicture);
var
 hExe     : Cardinal;
 Stream: TResourceStream;
 JPEGImage: TJPEGImage;
begin
 hExe:= LoadLibrary(PChar(Exe));
 Stream:= TResourceStream.Create(hExe, JPEG,'JPG');
 JPEGImage:= TJPEGImage.Create;
 try
   JPEGImage.LoadFromStream(MemStream);
   ThePicture.Assign(JPEGImage);
 finally
   JPEGImage.Free;
   Stream.Free;
 end;
end;


Вот вызов

Код

LoadJPEGFromRes(ParamStr(0), 'MYJPEG', Image1.Picture);


С загрузкой jpg в ресурс и выгрузку в файл на диске все окей, а вот выгрузка в Image - ОШИБКА!  Помогите в чем дело! smile 

Автор: MetalFan 4.2.2011, 11:25
Цитата(simsmann @  3.2.2011,  21:47 Найти цитируемый пост)
   JPEGImage.LoadFromStream(MemStream);

а откуда взялася MemStream? Судя по коду туда надо просто Stream вставить.

Автор: simsmann 5.2.2011, 02:23
С этим понятно, это было подпраленно, тут дело в другом.
В прочем вариант я нашел.
В указанном вышге коде вообще несколько ошибок.
Ясделал по другому, причем можно 2 вариантами.

Автор: CodeMonkey 5.2.2011, 02:45
В оригинальную тему про BeginUdate/Update/EndUpdateResource на всех платформах: http://www.transl-gunsmoker.ru/2010/11/mslu.html.

Вовсе не нужно было их реализовывать с нуля самому.

Ну и ещё в тему http://www.transl-gunsmoker.ru/2008/12/blog-post_9202.html.

Автор: northener 5.2.2011, 03:30
<offtop>
 Некроманты/Некрофилы, блин. smile
</offtop>

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