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

Вниз

Присваивние строки полю 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
3-70086
mihei
2003-04-29 09:03
2003.05.22
Помогите с CheckBoxes


14-70446
Mikelson
2003-04-29 14:02
2003.05.22
Библиотека контейнеров


1-70322
OlegK
2003-05-08 14:12
2003.05.22
Преобразование миллисекунд в тип Tdatetime ??


1-70266
jen_bond
2003-05-11 22:55
2003.05.22
Мастера подскажите как определить где возникает ошибка!


6-70425
Vovaka
2003-03-25 09:39
2003.05.22
Как получить текущий DNS-сервер ?