Resposta técnica para um problema com strings.
20/02/2003
0
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
Curtir tópico
+ 0
Responder
Posts
20/02/2003
Aroldo Zanela
[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.
Responder
Clique aqui para fazer login e interagir na Comunidade :)