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?


As-mad

As-mad

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.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar