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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2010, 13:33   #1
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию Функция поиска и замены подстроки в строке типа PChar

Делаю dll в которой идет преобразование строк. При использовании string выдает ошибки. Помогите пожалуйста с функцией поиска и замены строк с использованием PChar.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 19.04.2010, 13:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Так а что функция то должна делать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.04.2010, 13:48   #3
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так а что функция то должна делать?
Преобразовывает HTML код. На входе текст страницы, на выходе выдранные нужные данные.

Цитата:
function plg_ParseLinkHTML(HTMLcode:PChar;st rParam:Pchar):PChar;stdcall;
var //sp,spPar:string;
sp,spPar:PChar;
nm,i:integer;
ldDate:TDate;
begin
Result:='';
try
ldDate:=strtodate(strParam);
spPar:=PChar(FormatDateTime('yyyy"" mm""dd',ldDate));
except
exit;
end;
sp:='';
sp:=HTMLcode;
if sp='' then exit;
sp:=StrPos(sp,'<table cellspacing="1" cellpadding="5" border="0">');
spPar:=StrPos(sp,'</table>');
nm:=StrLen(Sp)-StrLen(spPar);
spPar:=StrMove(spPar,sp,nm);
sp:=spPar;
plg_ParseLinkHTML:=PChar(sp);
end;
Например выдрать нужную таблицу. Ошибка в строке:
Цитата:
spPar:=StrMove(spPar,sp,nm);
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)

Последний раз редактировалось Stilet; 19.04.2010 в 13:55.
Son вне форума Ответить с цитированием
Старый 19.04.2010, 13:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А почему не воспользуешся стандартной copy?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.04.2010, 14:24   #5
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему не воспользуешся стандартной copy?
C PChar она не работает, а на string возникает ошибка.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 19.04.2010, 14:28   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...а в string перевести никак?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.04.2010, 15:21   #7
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

При работе с html есть одна жестокая проблема с кодировками. Сам не мало страдал. Советую работать через memo:
Код:
// Процедура замены текста в Memo1 
procedure ReplaceText(FindText: PChar; ReplaceText: PChar);
var i: integer;
    StopSearch: bool;
begin
  i := 1;
  StopSearch := True;
  while StopSearch do
    begin
      i := Pos(FindText, Form1.Memo1.Lines.Text);
      if i > 0 then
        begin
          Form1.Memo1.SelStart := i - 1;
          Form1.Memo1.SelLength := Length(FindText);
          Form1.Memo1.SelText := ReplaceText;
        end
      else
        StopSearch := False;
    end;
end;
Виталий Желтяков вне форума Ответить с цитированием
Старый 19.04.2010, 15:51   #8
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
При работе с html есть одна жестокая проблема с кодировками. Сам не мало страдал. Советую работать через memo:
Код:
// Процедура замены текста в Memo1 
procedure ReplaceText(FindText: PChar; ReplaceText: PChar);
var i: integer;
    StopSearch: bool;
begin
  i := 1;
  StopSearch := True;
  while StopSearch do
    begin
      i := Pos(FindText, Form1.Memo1.Lines.Text);
      if i > 0 then
        begin
          Form1.Memo1.SelStart := i - 1;
          Form1.Memo1.SelLength := Length(FindText);
          Form1.Memo1.SelText := ReplaceText;
        end
      else
        StopSearch := False;
    end;
end;
К сожалению я использую этот код в dll библиотеке. Вот кусок из кода:
Цитата:
library ats_01;

uses
windows,Controls,SysUtils, System,Dialogs;

function plg_ParseLinkHTML(HTMLcode:PChar;st rParam:Pchar):PChar;stdcall;
var //sp,spPar:string;
sp,spPar:PChar;
s:string;
nm,i:integer;
ldDate:TDate;
begin
Result:='';
try
ldDate:=strtodate(strParam);
spPar:=PChar(FormatDateTime('yyyy"" mm""dd',ldDate));
except
exit;
end;
sp:='';
sp:=HTMLcode;
if sp='' then exit;
nm:=POS('<table cellspacing="1" cellpadding="5" border="0">',sp);
if nm=0 then exit;
s:=sp;
s:=Copy(s,nm,Length(s)-nm);
sp:=PChar(s);
ShowMessage(sp);
nm:=POS('</table>',sp);
if nm=0 then exit;

plg_ParseLinkHTML:=sp;

end;

exports
plg_ParseLinkHTML;

begin
end.
Выдает ошибку: Access violation at address 00404AF7 in module
Как понимаю проблема в распределении памяти. Отказываться от dll очень не хочется. Помогите кто может.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 19.04.2010, 15:59   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

1- sharemem
2- кто вам мешает получить pchar, преобразовать его в string, пропарсить чего-нужно, преобразовать в pchar и выдать обратно?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.04.2010, 16:06   #10
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- sharemem
2- кто вам мешает получить pchar, преобразовать его в string, пропарсить чего-нужно, преобразовать в pchar и выдать обратно?
Так и делаю. Функция отрабатывает. Даже выдает нужный результат. Но на этапе компиляции возникает ошибка при выходе из функции или во время освобождения dll.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция замены символов в строке. Fataller Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 23.01.2010 10:14
функция для подсчета количества символов в строке типа std::string a Артэс Общие вопросы C/C++ 3 06.07.2009 17:43
Нужна функция поиска в строке Kib Общие вопросы Delphi 3 19.04.2009 21:05
Не работает функция проверки подстроки в строке Cold_Night Помощь студентам 1 25.03.2009 01:30
Access violation на строке вида StrLCopy(PChar(st1),PChar(st2),10); malor Общие вопросы Delphi 1 11.07.2007 13:39