Resposta técnica para um problema com strings.
Estava desenvolvendo um component TreeView qdo me deparei com um erro ao declarar uma string num ponteiro. Para armazenar as informações do nó, utilizando o TreeView padrão da Borland é utilizado a seguinte declaração:
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
ImageIndex: Integer;
FontColor: TColor;
Text: String[255]; //campo text padrão string com 255 caracteres
[...]
//campos acrescidos
ImageIndexCollapsed : Integer;
ImageIndexExpanded : Integer;
DefaultImageIndex : Integer;
DefaultSelectedImageIndex : Integer;
Url:String[255] //campo adicionado por mim
end;
A função para leitura e escrita desses campos são semelhantes à seguinte:
procedure TTreeNTNode.ReadData(Stream: TStream; Info: PNodeInfo);
var I, Size : Integer;
begin
Stream.ReadBuffer(Size, SizeOf(Size));
Stream.ReadBuffer(Info^, Size);
Text := Info.Text; //atribuição padrão do texto
ImageIndex := Info.ImageIndex;
[...]
Url := Info.Url;
end;
Ao utilizar esse procedimento, não foi possível salvar mais do que 8 caracteres +- senão aparecia um símbolo estranho parecido com oe no final da string. A única solução que encontrei foi declarar a seguinte classe:
TUrl = record
Url: array[1..2] of String[255];
end;
E portanto na primeira classe dessa pergunta ficou assim
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
Text: String[255];
[...]
Url:TUrl
end;
e na função de leitura utilizava a seguinte atribuição
Url:= Info.Url.Url[1];
Imagino que isso tenha acontecido devido ao espaço reservado para o array seja maior, mas não consegui entender por que ocasionava esse erro nas strings. Nos campos do tipo Integer que eu adicionei tudo funcionou normalmente. Alguém saberia me explicar o porquê disso?
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
ImageIndex: Integer;
FontColor: TColor;
Text: String[255]; //campo text padrão string com 255 caracteres
[...]
//campos acrescidos
ImageIndexCollapsed : Integer;
ImageIndexExpanded : Integer;
DefaultImageIndex : Integer;
DefaultSelectedImageIndex : Integer;
Url:String[255] //campo adicionado por mim
end;
A função para leitura e escrita desses campos são semelhantes à seguinte:
procedure TTreeNTNode.ReadData(Stream: TStream; Info: PNodeInfo);
var I, Size : Integer;
begin
Stream.ReadBuffer(Size, SizeOf(Size));
Stream.ReadBuffer(Info^, Size);
Text := Info.Text; //atribuição padrão do texto
ImageIndex := Info.ImageIndex;
[...]
Url := Info.Url;
end;
Ao utilizar esse procedimento, não foi possível salvar mais do que 8 caracteres +- senão aparecia um símbolo estranho parecido com oe no final da string. A única solução que encontrei foi declarar a seguinte classe:
TUrl = record
Url: array[1..2] of String[255];
end;
E portanto na primeira classe dessa pergunta ficou assim
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
Text: String[255];
[...]
Url:TUrl
end;
e na função de leitura utilizava a seguinte atribuição
Url:= Info.Url.Url[1];
Imagino que isso tenha acontecido devido ao espaço reservado para o array seja maior, mas não consegui entender por que ocasionava esse erro nas strings. Nos campos do tipo Integer que eu adicionei tudo funcionou normalmente. Alguém saberia me explicar o porquê disso?
As-mad
Curtidas 0
Respostas
Aroldo Zanela
20/02/2003
[quote:d20d214370=´AS-Mad´]Estava desenvolvendo um component TreeView qdo me deparei com um erro ao declarar uma string num ponteiro. Para armazenar as informações do nó, utilizando o TreeView padrão da Borland é utilizado a seguinte declaração:
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
ImageIndex: Integer;
FontColor: TColor;
Text: String[255]; //campo text padrão string com 255 caracteres
[...]
//campos acrescidos
ImageIndexCollapsed : Integer;
ImageIndexExpanded : Integer;
DefaultImageIndex : Integer;
DefaultSelectedImageIndex : Integer;
Url:String[255] //campo adicionado por mim
end;
A função para leitura e escrita desses campos são semelhantes à seguinte:
procedure TTreeNTNode.ReadData(Stream: TStream; Info: PNodeInfo);
var I, Size : Integer;
begin
Stream.ReadBuffer(Size, SizeOf(Size));
Stream.ReadBuffer(Info^, Size);
Text := Info.Text; //atribuição padrão do texto
ImageIndex := Info.ImageIndex;
[...]
Url := Info.Url;
end;
Ao utilizar esse procedimento, não foi possível salvar mais do que 8 caracteres +- senão aparecia um símbolo estranho parecido com oe no final da string. A única solução que encontrei foi declarar a seguinte classe:
TUrl = record
Url: array[1..2] of String[255];
end;
E portanto na primeira classe dessa pergunta ficou assim
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
Text: String[255];
[...]
Url:TUrl
end;
e na função de leitura utilizava a seguinte atribuição
Url:= Info.Url.Url[1];
Imagino que isso tenha acontecido devido ao espaço reservado para o array seja maior, mas não consegui entender por que ocasionava esse erro nas strings. Nos campos do tipo Integer que eu adicionei tudo funcionou normalmente. Alguém saberia me explicar o porquê disso?[/quote:d20d214370]
Colega,
Raramente usei TreeView e estava verificando nas TI´s para ver se conseguia alguma coisa e encontrei algumas informações na [b:d20d214370]TI 27879 [/b:d20d214370]que tem um link para http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16719
Veja se te ajuda a resolver.
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
ImageIndex: Integer;
FontColor: TColor;
Text: String[255]; //campo text padrão string com 255 caracteres
[...]
//campos acrescidos
ImageIndexCollapsed : Integer;
ImageIndexExpanded : Integer;
DefaultImageIndex : Integer;
DefaultSelectedImageIndex : Integer;
Url:String[255] //campo adicionado por mim
end;
A função para leitura e escrita desses campos são semelhantes à seguinte:
procedure TTreeNTNode.ReadData(Stream: TStream; Info: PNodeInfo);
var I, Size : Integer;
begin
Stream.ReadBuffer(Size, SizeOf(Size));
Stream.ReadBuffer(Info^, Size);
Text := Info.Text; //atribuição padrão do texto
ImageIndex := Info.ImageIndex;
[...]
Url := Info.Url;
end;
Ao utilizar esse procedimento, não foi possível salvar mais do que 8 caracteres +- senão aparecia um símbolo estranho parecido com oe no final da string. A única solução que encontrei foi declarar a seguinte classe:
TUrl = record
Url: array[1..2] of String[255];
end;
E portanto na primeira classe dessa pergunta ficou assim
PNodeInfo = ^TNodeInfo;
TNodeInfo = packed record
Text: String[255];
[...]
Url:TUrl
end;
e na função de leitura utilizava a seguinte atribuição
Url:= Info.Url.Url[1];
Imagino que isso tenha acontecido devido ao espaço reservado para o array seja maior, mas não consegui entender por que ocasionava esse erro nas strings. Nos campos do tipo Integer que eu adicionei tudo funcionou normalmente. Alguém saberia me explicar o porquê disso?[/quote:d20d214370]
Colega,
Raramente usei TreeView e estava verificando nas TI´s para ver se conseguia alguma coisa e encontrei algumas informações na [b:d20d214370]TI 27879 [/b:d20d214370]que tem um link para http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16719
Veja se te ajuda a resolver.
GOSTEI 0