Очередная "Загадочная ошибка" ...
Модератор: Модераторы
>>Но ты по моему просто не "вник" ...
Я вникать не собираюсь. И другим не советую - нечего поощрять чужую лень.
Минимальный пример - почти всегда это уже решение проблемы, как минимум она перестанет быть загадочной и станет элементарной
Я вникать не собираюсь. И другим не советую - нечего поощрять чужую лень.
Минимальный пример - почти всегда это уже решение проблемы, как минимум она перестанет быть загадочной и станет элементарной
zub вы ещё не привыкли к загадкам алекса? 
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, а надо?
В принципе идея с VT интересна. Стащил пробник из демок VT, подправил (для интереса).... Хм... запустилось и без руганья (демка VT). Так что... алекс или перемудрил, или не ... в общем: zub прав по поводу теста.
Из ссылки "о рыбе" вскользя посмотрел... чёт не охото ковырять в наброске.
п.с.
Лекс Айрин дело вкуса.
Из ссылки "о рыбе" вскользя посмотрел... чёт не охото ковырять в наброске.
п.с.
Лекс Айрин дело вкуса.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik,знаешь, а ведь я реально несколько раз пытался готовить минимальный пример и находил таки ошибку.
сделали, мордой ткнули, убедили. А так: есть бубен... он помогает ВСЕМ.я реально несколько раз пытался готовить минимальный пример
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, бубен это слишком суровый способ... я тут недели две переделывал свой старый код, который до этого работал... и у меня волосы дыбом вставали... а у меня только хвост где-то 30см длинной...в общем, ирокез еще тот))) Перепутанный порядок присваиваний это только самое простое. Пришлось учиться пользоваться отладчиком(( А в одном месте я вообще очищал все и до сих пор удивляюсь как это работало.
А со ссылками вообще надо сразу на ежиках пробовать, замыкать код работающий со ссылками в отдельные объекты и проверять каждый шаг по три раза.
А со ссылками вообще надо сразу на ежиках пробовать, замыкать код работающий со ссылками в отдельные объекты и проверять каждый шаг по три раза.
" я тут недели две переделывал свой старый код" - и кто в сим доктор?
п.с.

п.с.
и до сих пор удивляюсь как это работало.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
упс... имеется ввиду две недели назад. Хотя я пишу медленно, так что и так тоже верно)))
В общем это "неправильные пчелы и они делают неправильный мед" ....
1 Минимальный пример Без VT работает И так И ЭДАК !
То есть весь гон на NewStr( ...); и DisposeStr(...); идет лесом полем ...
2 Ошибка вылезает ВНУТРИ кода VT (и не спрашивайте меня как она вылезла в inputStr )....
3 Идея в том что сделал хомут в при добавлении новых элементов ....
в попытке "сделать правильно" пытался добавить ручное выделение памяти
Node := AddChild(nil ,getMem(SizeOf(TLCLTextData)) );
но разницы нет....
4 Ковыряй код AddChild я нигде не нашел getMem или что-то подобное ...
(Такое впечатление что VT как то кучей самостоятельно рулит ... или делает это неизвестным мне способом )
5 В примерах вообще просто RootCount увеличивают ...
Короче чем глубже влез тем дальше "вылез" ..
Зы
Если кто не понял вопрос в НАДЕЖНОСТИ эмпирически найденного решения .
Пока работает но что если это "стечение глюков и удачное состояние фазы луны"
Зы Зы
Гм вроде не так все и плохо как я подумал ... В примерах на wiki.lazarus.freepascal.org
http://wiki.lazarus.freepascal.org/Virt ... or_Lazarus
вроде делают что-то похожее на мои каракули ...
1 Минимальный пример Без VT работает И так И ЭДАК !
То есть весь гон на NewStr( ...); и DisposeStr(...); идет лесом полем ...
Код: Выделить всё
unit CT_u1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
public
end;
TLCLTextData = record
T1: PString;
T2: PString;
DT : Integer;
end;
PLCLTextData = ^TLCLTextData;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
Function inputStr(Q,D:String;W:Integer):String;
Var
L,l1,l2:TLabel;
E:TEdit;
B:TButton;
rF:Tform;
begin
rF:=Tform.Create( Application);
begin
L:=TLabel.Create(rf);
l.Caption:=Q; L.Align:=alTop;
L1:=TLabel.Create(rf);
l1.Caption:='Название'; L1.Align:=alTop;
L2:=TLabel.Create(rf);
l2.Caption:='Значение'; L2.Align:=alTop;
E:=TEdit.Create(rf);
E.Text:=D;
E.Align:=alTop;
B:=TButton.Create(rf);
b.Align:=alTop;
B.Caption:='Ok';
B.ModalResult:=mrOk;
rf.InsertControl(b);
rf.InsertControl(e);
rf.InsertControl(l2);
rf.InsertControl(l);
rf.InsertControl(l1);
end;
rF.Top:=top+20;
rf.Left:=Left+10;
rF.Width:=W;
rF.Height :=100;
l.Caption:=Q;
if rF.ShowModal=mrOk then
inputStr:=e.text else inputStr:=D;
rF.Free;
end ;
var
Data: PLCLTextData;
S,S1,s2:String;
PS:PString;
begin
Data:=GetMem(SizeOf(TLCLTextData));
Data^.T1:=NewStr('Вес в МТ'); Data^.T2:=NewStr('00000');
PS:= Data^.T2 ;S:=Data^.T1^;
if PS<>Nil then S1:=PS^ else S1:='' ;// Тут ясное дело проверка не нужна но для чистоты эксперимента пусть будет ...
DisposeStr(PS);PS:=Nil;
S2:=InputStr(S,s1,220);
Data^.T2 := NewStr(S2); //DisposeStr(PS);
Label1.Caption:=Data^.T2^;
FreeMem(Data);
end;
end.
2 Ошибка вылезает ВНУТРИ кода VT (и не спрашивайте меня как она вылезла в inputStr )....
3 Идея в том что сделал хомут в при добавлении новых элементов ....
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PLCLTextData;
begin
With VST3 do
begin
NodeDataSize := SizeOf(TLCLTextData);
Node := AddChild(nil );
Data := GetNodeData(Node);
Data^.T1:=NewStr('Вес в МТ'); Data^.T2:=NewStr('00000');
//ValidateNode(Node, False); // понятия не имею нужна ли это строка но что с ней что без нее.. результат тот-же . :idea:
end;
end;
в попытке "сделать правильно" пытался добавить ручное выделение памяти
Node := AddChild(nil ,getMem(SizeOf(TLCLTextData)) );
но разницы нет....
4 Ковыряй код AddChild я нигде не нашел getMem или что-то подобное ...
(Такое впечатление что VT как то кучей самостоятельно рулит ... или делает это неизвестным мне способом )
5 В примерах вообще просто RootCount увеличивают ...
Короче чем глубже влез тем дальше "вылез" ..
Зы
Если кто не понял вопрос в НАДЕЖНОСТИ эмпирически найденного решения .
Пока работает но что если это "стечение глюков и удачное состояние фазы луны"
Зы Зы
Гм вроде не так все и плохо как я подумал ... В примерах на wiki.lazarus.freepascal.org
http://wiki.lazarus.freepascal.org/Virt ... or_Lazarus
вроде делают что-то похожее на мои каракули ...
Alex2013 писал(а):Или я что-то не понял ....Или вы хотите сказать что S1:=PS^ передает не данные, а УКАЗАТЕЛЬ ? Но это же бред какой-то ...
Давайте рассмотрим аналогию. Вы можете ехать на своей машине сами (аналог - вручную расправляться с указателями), либо нанять профессионального водителя, которому надо только сказать, откуда ехать и куда. Вы же наняли водителя и командуете ему периодически под руку "нажми тормоз", "отпусти сцепление". Нет, конечно, хозяин - барин, но он привык водить иначе, так что, выполняя не всегда своевременные указания, можно и в ДТП попасть.
Можно разобрать поподробнее.
Все данные в Паскале могут быть статическими и динамическими. Статические хранятся сразу ясно где, это определено ещё при компиляции, динамические - там, где на них найдётся место (и это место надо выделять и освобождать). Можно делать это вручную - и добро пожаловать в систему указателей, можно - выбрать специальные типы данных (строки - кроме ShortString, динамические массивы, классы), и компилятор вставит код, который автоматически выделит память, скопирует, освободит ненужное (особенно для строк). Копируя строку, Вы поручаете компилятору решить самому, когда скопировать только указатель, а когда - создать совершенно новую строку (наверно, перед тем, как Вы измените одну из "копий"). Но рассчитывать, что здесь у Вас будет копия указателя, а там - копия строки - не стоит, как не стоит рассчитывать, что перед данным поворотом данный профессиональный водитель нажал сцепление. Общее правило: нужны указатели - работайте с PChar, хотите удобства и строк - используйте тип String и забудьте о выделении/освобождении памяти. Можно переходить от одного к другому, но работать с каждым из них надо отдельно. Получили PChar(String) - скопируйте строку куда-то, а уж потом освобождайте по ненадобности.
-
LearnMagic
- новенький
- Сообщения: 66
- Зарегистрирован: 10.11.2016 22:13:38
Alex2013 писал(а):... В примерах на wiki.lazarus.freepascal.org вроде делают что-то похожее на мои каракули...
Принципиальные отличия:
TTreeData = record
Column0: String;
Column1: String;
Column2: String;
end;
Код: Выделить всё
procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(Node);
if Assigned(Data) then begin
Data^.Column0 := '';
Data^.Column1 := '';
Data^.Column2 := '';
end;
end;
Data^.Column0 := ''; - освобождение памяти занимаемой строками
Примера нет...
1.Доступные компилятору локальные стринг переменные автоматически инициализируются и финализируются.
2."Размножение" стринг переменных "указателями" не вызывает увеличения их refcount
Вангую что ты сначала делаешь 2, а потом компилятор делает 1 и у тебя на руках остается дохлый указатель при попытке разименования которого в дальнейшем всё валится
1.Доступные компилятору локальные стринг переменные автоматически инициализируются и финализируются.
2."Размножение" стринг переменных "указателями" не вызывает увеличения их refcount
Вангую что ты сначала делаешь 2, а потом компилятор делает 1 и у тебя на руках остается дохлый указатель при попытке разименования которого в дальнейшем всё валится
"Зубы чистили ?"
рискую совсем занудой стать .... но уже писал !
viewtopic.php?p=123838#p123838
Третий вариант тестового проекта ...
Там все было так же кроме Assigned(Data) ну не догадался я самостоятельно что это важно ...
В примерах что идут поставке такого не обнаружили .
Потом сделал так
Пример есть просто он не сработал я думал, что VT там совсем не причем ... оказалось иначе .
Ладно ухожу собирать очередное исследование по примерам в вике ....(Жль их сразу не обнаружил )
Третий вариант тестового проекта ...
Там все было так же кроме Assigned(Data) ну не догадался я самостоятельно что это важно ...
В примерах что идут поставке такого не обнаружили .
Код: Выделить всё
procedure TForm1.VST3FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PLCLTextData;
begin
Data := Sender.GetNodeData(Node);
Data^.T1 := '';
Data^.T2 := '';
end;
Потом сделал так
Код: Выделить всё
procedure TForm1.VST3FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PLCLTextData;
begin
Data := Sender.GetNodeData(Node);
DisposeStr(Data^.T1);
DisposeStr(Data^.T2);
end;
Пример есть просто он не сработал я думал, что VT там совсем не причем ... оказалось иначе .
Ладно ухожу собирать очередное исследование по примерам в вике ....(Жль их сразу не обнаружил )
Alex2013 хорэ замусоривать интернет
