Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизПрисваивние строки полю Pointer Найти похожие ветки
← →
Переяслов Григорий (2003-05-07 19:02) [0]Уважаемые мастера.
Необходимо в поля TreeNode.Data записывать адреса строк, значения которых находятся в переменной String. Делаю это так:
Var
stData : String;
pData, P : Pointer;
Begin
. . .
stData := "Что-нибудь";
GetMem(pData, Length(stData));
P := @stData[1];
Move(P^, pData^, Length(stData));
NodeCL.Data := pData;
. . .
end;
Что я делаю не так?
← →
Palladin (2003-05-07 19:25) [1]а что не так?
← →
default (2003-05-07 19:34) [2]вот и я хотел спросить
вроде всё так...
← →
Переяслов Григорий (2003-05-07 19:35) [3]Когда читаю данные NodeCL.Data, то там полная каша, явно, данные не те. Читаю так:
St := String(Node.Data^);
← →
Zz_ (2003-05-07 19:42) [4]Концевого нуля у тебя нет
← →
default (2003-05-07 19:42) [5]procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
P: Pointer;
begin
S := "12345";
P := @S;
Caption := String(P^)
end;
почему была ошибка - если приводишь указатель к типу String, то он
должен указывать на строку типа String (P := @S), а не на её данные (P := @S[1])
Удачи!
← →
Zz_ (2003-05-07 19:43) [6]А что, так нельзя ?
NodeCL.Data := Pointer(@stData[1]);
← →
Palladin (2003-05-07 20:00) [7]
> Zz_ (07.05.03 19:43)
а ты подумай
← →
Переяслов Григорий (2003-05-07 20:03) [8]> default
stData := "C:\SSS Shared\StoreHouseData\Y2003\April\20\CL.1";
делаю:
GetMem(pData, Length(stData));
P := @stData[1];
Move(P^, pData^, Length(stData));
NodeCL.Data := pData;
После Move смотрю String(P^) и вижу:
":\SSS Shared\StoreHouseData\Y2003\April\20\CL.1"#0#0#0#0"6"#0#0#0"C:\SSS Share"
делаю:
GetMem(pData, Length(stData));
P := @stData;
Move(P^, pData^, Length(stData));
NodeCL.Data := pData;
После Move смотрю String(P^) и вижу:
"*§"#0"<"
← →
default (2003-05-07 20:17) [9]зачем Move, GetMem... - я не понимаю смысла действий
почему нельзя сделать как в моём примере?
почему нельзя просто ...StData := "12345"; NodeCL.Data := @stData;
Edit1.Text := String(NodeCL.Data^)...?
← →
Переяслов Григорий (2003-05-07 20:21) [10]> default © (07.05.03 20:17)
Дело в том, что каждому элементу дерева NodeCL присваивается своя строка, и ее надо где-то хранить в узле дерева.
← →
default (2003-05-07 20:26) [11]ну после Move-а первый параметр не изменяется (P в нашем случае) !(
← →
jack128 (2003-05-07 20:28) [12]Вобщем вот код
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
p : pointer;
begin
s := "my string";
GetMem(p,Length(s));
Move(PChar(s)^,p^,Length(s));
if TreeView1.Items[0].Data = nil then FreeMem(TreeView1.Items[0].Data ) ;
TreeView1.Items[0].Data := p;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(PChar(TreeView1.Items[0].Data));
end;
← →
jack128 (2003-05-07 20:31) [13]Sorry естественно
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
p : pointer;
begin
s := "my string";
GetMem(p,Length(s )+1);
Move(PChar(s)^,p^,Length(s )+1);
if TreeView1.Items[0].Data <> nil then FreeMem(TreeView1.Items[0].Data ) ;
TreeView1.Items[0].Data := p;
end;
← →
Переяслов Григорий (2003-05-07 20:36) [14]> jack128 © (07.05.03 20:28)
> default ©
и всем.
"Отрубает" первый символ. Строку имею в виде:
":\SSS Shared\StoreHouseData\Y2003\April\20\CL.1"#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
вместо:
"C:\SSS Shared\StoreHouseData\Y2003\April\20\CL.1"
кю :(
← →
Переяслов Григорий (2003-05-07 20:39) [15]> jack128 © (07.05.03 20:31)
Получил с +1 ^
":\SSS Shared\StoreHouseData\Y2003\April\20\CL.1"#0"h"#3"lxdT"#0"xdT"#0"l"#$1B#0#0"Alig"
← →
jack128 (2003-05-07 20:43) [16]Не приводи к строке(string) - приводи к Pchar!!
string по отрицательному смещению хранит размер строки, а у тя там мусор
← →
Переяслов Григорий (2003-05-07 20:44) [17]Если привожу к PChar - та-же песня. Меня волнует, куда делся первый символ?
← →
Fantasist. (2003-05-07 21:06) [18]
function StrToBuf(const s:string):pointer;
var
i:Cardinal;
begin
i:=Length(s);
GetMem(Result,i+sizeof(i));
move(i,Result^,sizeof(i));
move(pointer(s)^,pointer(Cardinal(Result)+sizeof(i))^,i);
end;
function BufToStr(const p:pointer):string;
var
i:Cardinal;
begin
move(p^,i,sizeof(i));
SetLength(Result,i);
move(pointer(Cardinal(p)+sizeof(i))^,pointer(Result)^,i);
end;
...........
...........
var
p:pointer;
procedure TForm1.FormCreate(Sender: TObject);
var
s:string;
begin
s:="Warrahhhhaaaaaaaaa!";
p:=StrToBuf(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(BufToStr(p));
FreeMem(p);
end;
Конечно, с выделением/освобождением здесь памяти плоховато.
← →
default (2003-05-07 23:30) [19]Fantasist. (07.05.03 21:06)
это всё понятно но смысл?!
проще просто сохранять данные в "новой" строке(String)
← →
Тих (2003-05-08 00:51) [20]Показываю, как КРАСИВО
TString = class
private
FString: string;
public
constructor Create(AString: string);
end;
constructor TString.Create(AString: string);
begin
FString := AString;
end;
pNode := pTreeView.Items.Add(...);
pNode.Data := TString.Create("new string");
// Все анонимные экземпляры класса освобождать в OnDeletion
← →
default (2003-05-08 16:55) [21]Тих (08.05.03 00:51)
прямо не описуемо
← →
Serginio (2003-05-08 17:03) [22]Используй PString или ссылку на структуру
TRecString
FString:String;
end;
Str:PString;
New(Str);
Str^:="hfhfhfh"; Дело в том , что при выходе из процедуры строка уничтожается. Можно конечно увеличить счетчик ссылок на строку но я пока не знаю как. В любом случае ответственность за удаление строки будет лежать на тебе. Используй PString.
← →
Переяслов Григорий (2003-05-08 17:55) [23]На конкурсе идей победил вариант:
запись:
Var
stData : PChar;
stData := PChar(Path + "\" + FY.Name + "\" + FM.Name + "\" + FD.Name + "\" + FCL.Name);
ListObjects.Items.AddChildObject(NodeDay, FCL.Name, Pointer(StrNew(stData)));
чтение:
Var
FN : PChar;
FN := PChar(Node.Data);
кстати, почему в хелпе пишут, что StrNew - obsolete? Что надо использовать вместо нее?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c