Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-70280
bvv20
2003-05-08 11:11
2003.05.22
поис и копирование


1-70226
Top Gun
2003-05-11 16:14
2003.05.22
Определение номера контрола


3-70106
romario
2003-04-29 10:20
2003.05.22
Как произвести обсчет?


6-70412
Orcy
2003-03-23 00:29
2003.05.22
Как послать sms


1-70276
TALLA_
2003-05-12 16:15
2003.05.22
Как сделать некоторые Rows(или ячейки)в StringGrid другим цветом?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский