Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Преобразование TCaption в Pchar   Найти похожие ветки 

 
Fenix ©   (2006-03-09 19:55) [0]

У меня код:
TextTag:=PChar(form1.Edit1.Text+form1.Edit1.Text);
Возникает ошибка. form1.Edit1.Text возращает на 1 символ больше (символ конца строки). Как это можно обойти? Просто String я не могу пользоваться, т.к. у меня этот код используеться в Dll. Подскажите как можно раелизовать правиьно сложение строк?


 
Desdechado ©   (2006-03-09 21:23) [1]

какая-то непоследовательность:
> Возникает ошибка.
текст ошибки

> form1.Edit1.Text возращает на 1 символ больше (символ конца строки).
Не верю. Что в нем есть, то и возвращает.


 
Fenix ©   (2006-03-09 21:46) [2]

raised exeption class EAccessViolation whith messange "Access Violetion at adress 00404133 in module project1.exe Read of adres 00d247b0"

> > form1.Edit1.Text возращает на 1 символ больше (символ
> конца строки).
> Не верю. Что в нем есть, то и возвращает.

Это когда эта строка находиться в ДЛЛ.... и пото заноситься в Richedit.

PChar(form1.Edit1.Text)
вот что этот код возращает (еще раз повторюсь, что этот код стоит  в ДЛЛ)
asdf


 
tesseract ©   (2006-03-09 21:49) [3]


> asdf

а кто вам сказал, что это символ конца строки?

И вопрос откуда ты вызываешь свою функцию?


 
Fenix ©   (2006-03-09 21:53) [4]

Эта функция у меня в ДЛЛ.

Это в Unit1(форма в ДЛЛ)
TextTag:=PChar(form1.Edit1.Text);

Это в самой обаботки ДЛЛ
Result:=TextTag;


 
Fenix ©   (2006-03-09 22:01) [5]

Когда я допустим в ДЛЛ пишу
TextTag:=PChar("asdfasdfafd"+"asdfasdf");
то он нормально объединяет строки

а когда
TextTag:=PChar(form1.Edit1.Text+form1.Edit2.Text);
то выдает ошибку....


 
Desdechado ©   (2006-03-09 22:02) [6]

> Это в самой обаботки ДЛЛ Result:=TextTag;
ну, а саму функцию не желаешь показать
а ошибка в каком месте и при каком вызове?


 
Fenix ©   (2006-03-09 22:04) [7]


var
 Form1: TForm1;
 Texttag:Pchar;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if form1.CheckBox1.Checked then
TextTag:=PChar("< href="+form1.Edit2.Text+" title="+Form1.Edit1.Text+" target="_blank">"+form1.edit1.Text+"</a>")
else
TextTag:=PChar("< href="+form1.Edit2.Text+" title="+Form1.Edit1.Text+" >"+form1.edit1.Text+"</a>");
end;

Вот обработчик функци.....

Ошибка возникает именно когда Edit не пустые...


 
Desdechado ©   (2006-03-09 22:14) [8]

у тебя не лишние символы появляются, у тебя область памяти, на которую указывает PChar освобождается при выходе из процедуры, и там просто мусор остается


 
tesseract ©   (2006-03-09 22:18) [9]

Вроде не должно, ежели texttag - глобальная переменная, это внутренние переменные при выходе освобождаются.


 
Desdechado ©   (2006-03-09 22:23) [10]

PCHar - это указатель, а на что ему указывать - надо правильно делать
Так он указывает на мусор, который получился после выделения (и освобождения) локальной памяти для суммы строк.


 
Fenix ©   (2006-03-09 22:23) [11]

Вот я тоже думаю что не должно....а ошибка то выдаеться, притом если Edit"ы заполнены... если они пусты то все норм выдает...


 
Fenix ©   (2006-03-09 22:24) [12]


> PCHar - это указатель, а на что ему указывать - надо правильно
> делать
> Так он указывает на мусор, который получился после выделения
> (и освобождения) локальной памяти для суммы строк.

Тогда как мне быть?? как мне правильно реализовать объединение и передачу строки?


 
bred   (2006-03-10 05:00) [13]

Desdechado ©   (09.03.06 22:23) [10]
ммм... что-то не то ( не должно быть так...


 
Сергей М. ©   (2006-03-10 09:38) [14]


> bred   (10.03.06 05:00) [13]



> что-то не то ( не должно быть так


Именно то .. Именно так и происходит в дан.случае.


> Просто String я не могу пользоваться, т.к. у меня этот код
> используеться в Dll


String"ом нельзя пользоваться лишь в случае, когда DLL планируется к использованию в приложениях, построенных в иных средах нежели Делфи и BCB. У тебя этот случай ?


 
Плохиш ©   (2006-03-10 10:51) [15]


> Fenix ©   (09.03.06 21:46) [2]
> raised exeption class EAccessViolation whith messange "Access
> Violetion at adress 00404133 in module project1.exe Read
> of adres 00d247b0"

Можно узнать на какой конкретно строке и чему равны используемые переменные?

> Fenix ©   (09.03.06 22:04) [7]
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> if form1.CheckBox1.Checked then
> TextTag:=PChar("< href="+form1.Edit2.Text+

Руки бы повырывал.


 
Fenix ©   (2006-03-10 14:36) [16]


> Сергей М. ©

Мои формы будут использоваться только в моей программе... Так что получаеться можно использовать String? Просто я читал, что там будут проблемы с размещением этих переменных в памяти...


 
Stakan ©   (2006-03-10 14:45) [17]

Fenix ©   (10.03.06 14:36) [16]
Можно, только не забыть uses ShareMem первым в списке uses и в exe и в dll в файле .dpr


 
Fenix ©   (2006-03-10 14:47) [18]


> Stakan ©

ок сенки, так и сделаю))


 
Fenix ©   (2006-03-10 15:26) [19]

После закрытия программы выскакивает ошибка "invalid pointer operation". В чем может быть проблема?


 
Stakan ©   (2006-03-10 15:37) [20]

Fenix ©   (10.03.06 15:26) [19]
Пост [17] читал внимательно? Всё понял?


 
Сергей М. ©   (2006-03-10 15:44) [21]


> Так что получаеться можно использовать String?


Да, можно.

С соблюдением некоторых тонкостей, относящихся к внутреннему менеджменту памяти.

См. ShareMem vs Run-Time Packages


 
Гаврила ©   (2006-03-10 16:18) [22]

Ребята, не вводите в заблуждение.
ShareMem нужен только в том случае, если строковые параметры передаются между DLL и EXE
Внутри самой DLL строки можно использовать сколько влезет без всяких Sharemem"ов и прочего шаманства


 
Fenix ©   (2006-03-10 16:20) [23]


> Гаврила ©

Все верно, мне как раз и надо что бы из ДЛЛ передалась строчка в мою программу :)


 
Гаврила ©   (2006-03-10 16:46) [24]


> Fenix ©  

советую внутри DLL все PChar убрать (а то дров наломаешь),заменить на обычные строки,
sharemem убрать,
передавать из Dll в программу WideString


 
Leonid Troyanovsky ©   (2006-03-10 16:51) [25]


> Гаврила ©   (10.03.06 16:46) [24]

> советую внутри DLL все PChar убрать (а то дров наломаешь),
> заменить на обычные строки,
> sharemem убрать,


Dll тоже убрать.
Все - ухожу, ухожу :)

--
Regards, LVT.


 
Fenix ©   (2006-03-10 19:19) [26]

> Гаврила ©

>советую внутри DLL все PChar убрать (а то дров наломаешь),заменить на >обычные строки,

Я так и сделал

> передавать из Dll в программу WideString

Типа
Function ShowForm():TWideString; ???
а потом в программе:
richedit1.seltext:=ShowForm();
так???


 
Гаврила ©   (2006-03-10 20:19) [27]

без T
function ShowForm(): WideString;
тип WideString похож на паскалевский string, за исключением
- он Unicode"ный
- он всегда создает копию при присвоениях (не нужен ShareMem, соответственно, менее оптимально по скорости, зато более универсально)


 
Fenix ©   (2006-03-10 20:22) [28]

У меня еще такой вопрос в добавок к теме...
Можноли из ДЛЛ предать не в Tstring, а в TStrings? Просто мне надо передать текст, не в одну строчку а разбитый на несколько, что бы не сбивалось его восприятие.


 
Гаврила ©   (2006-03-10 22:21) [29]


> Fenix ©  


> TStrings?

Для того, чтобы такая штука, как передача объекта отработала нормально, мы должны собрать библиотеку и хост с соответствующим пакетом (package). при этом мы, разумеется, сделаем невозможным испольование библиотеки из программ, собранных на других языках программирования.
Поэтому лучше сделать так:
передавать тот же (вайд)стринг (или пчар), с разделителями #13#10 в нужных местах.
Стрингс с этим дружит хорошо также (см. свойство TStrings.Text - свойства рабтает и на чтение и на запись)


 
Fenix ©   (2006-03-10 23:04) [30]

У меня возникает ошика, когда я из длл посылаю TString в программу...
у меня код такой в длл:
function ShowForm:Tstrings;stdcall;
begin
     Result:=TextTag;
end;

texttag:=memo2.Lines;

а это уже в программе:
richedit1.SelText:=Proc.Text;

и возникает ошибка с чтением из памяти...


 
Гаврила ©   (2006-03-10 23:13) [31]

// USES SHAREMEM, ... ;
function ShowForm:WideString;stdcall;
begin
 Result:=memo2.Lines.Text;
end;
а это уже в программе:
richedit1.SelText:=Proc;


 
Fenix ©   (2006-03-10 23:14) [32]

ясн спс))



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.047 c
15-1140281080
Kerk
2006-02-18 19:44
2006.03.26
[firebird] Оптимизация запроса


11-1122833928
Thaddy
2005-07-31 22:18
2006.03.26
kol skype demo


2-1142083990
Horadric
2006-03-11 16:33
2006.03.26
как из текстового поля Edit достать выражение


15-1141295917
ALEXD31
2006-03-02 13:38
2006.03.26
Магнитооптический диск с файловой системой HTFS


2-1141724697
Der Nechk@ssoff
2006-03-07 12:44
2006.03.26
перемещение вверх и вниз