Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Преобразование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.057 c
2-1141845293
Новочеркасский Волк
2006-03-08 22:14
2006.03.26
Отправка письма. НУ НИКАК НЕ ХОЧЕТ!!!


15-1141127501
ISP
2006-02-28 14:51
2006.03.26
Ну что, пора и на мобилы антивирус ставить....?


2-1141706207
trych
2006-03-07 07:36
2006.03.26
дата


4-1136581044
Rommel
2006-01-06 23:57
2006.03.26
Control на рабочем столе


2-1141629214
Bratskiy
2006-03-06 10:13
2006.03.26
Выравнивание Label





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский