Форум: "Начинающим";
Текущий архив: 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.037 c