Array
(
)

Como conseguir mostrar um campo memo com BDS 20006?

Toninhonunes
   - 23 abr 2007

Olá Pessoal,

Estou a utilizar o BDS 2006 com BDP driver Access, tudo estava indo bem até eu não conseguir mostrar um campo memo em qualquer componente, tanto no DataGrid como em um TextBox, o valor retornado é o seguinte, System.Char[], como proceder para fazer o dado ser mostrado nestes componentes? já pesquisei em tudo que é lugar e não vi nenhum exemplo prático disso, gostaria que os amigos aqui do fórum que já tem experiência com o .NET me ajudassem nessa questão.

Obrigado,

Toninho Nunes.


Toninhonunes
   - 23 abr 2007

Ok pessoal, vou compartilhar aqui o que consegui resolver, pelo menos está a funcionar agora.

Campos memo no Access e em outros databases eu acho, não testei, não pode ser inserido diretamente como string, tem que ser como uma array of char, e o parametro tem que ser blob e o subtype stMemo no BdpAdapter ou no BdpCommand na parte parameters você define isso, feito a definição de parâmetros, segue o código, isso é da minha estrutura, mas o trecho que grava no memo pode ser adaptado.

//Gravar dados e o memo também.
procedure TWebForm1.Insert;
var
ArrayofChar : Array of Char;
i : integer;
Texto : String;
begin
BdpConnection1.Open;
with BdpDataAdapter1.InsertCommand do
try
Parameters[´CODIGO_TOPICO´].Value := DropDownList1.SelectedValue;
Parameters[´TITULO_MATERIA´].Value := tbTituloChamada.Text;
Parameters[´SUB_TITULO´].Value := tbChamadaCurta.Text;

//Pega o texto
Texto := tbMateriaCompleta.Text;
SetLength(ArrayofChar, Length(texto));

//Varre o texto e jogas os caracteres na array
for i:= 1 to Length(texto) do
ArrayofChar[i-1]:= texto[i];

//Depois joga direto no parametro, já era, tá feio
Parameters[´CONTEUDO_MATERIA´].Value := ArrayofChar;


Parameters[´LEGENDA_FOTO´].Value := tbLegendaFoto.Text;
Parameters[´HORA_MATERIA´].Value := System.DateTime.Now.ToString;
Parameters[´DATA_MATERIA´].Value := System.DateTime.Today.ToString;
ExecuteNonQuery;
finally
BdpConnection1.Close;
end;
end;

Para visualizar foi feita uma função.

function TWebForm1.InsertBlobAsText(DataItem:TObject): string;
var
st : String;
type
TArrayOfChar = Array Of Char;
begin
st := Convert.ToString(TArrayOfChar(DataItem));
result := st;
end;


neste caso eu estava a utilizar um DataGrid, criei um databound refereciando o campo memo, depois eu o transformei como ItemTemplate, feito isso vá no arquivo aspx e insira a função direto no html onde faz referência ao campo que deseja mostrar, conforme mostrado abaixo.

<Columns>
<ASP:TemplateColumn>
<ItemTemplate>
<asp:Label runat=´server´ text=´<¬#
InsertBlobAsText(DataBinder.Eval(Container, ´DataItem.CONTEUDO_MATERIA´))
¬>´></asp:Label>
</ItemTemplate>
</ASP:TemplateColumn>
</Columns>

Pronto, já era, é só rodar e veja o seu dagrid mostrando dados do campo
memo.

Que desgraça, não se acha quase nada de exemplos em Delphi.NET na internet pra fazer isso, perdi o dia hoje com isso, claro também to estudando o framework, demora sacar um pouco as coisas, mas o website tá saindo, e não um sistema, to fazendo tudo com webstandards.

Algo tão trivial não deveria ser complicado implementar, digo trabalhoso,
pois em PHP isso é muita moleza fazer.


Falowz,

Toninho Nunes


Adrbrusc
   - 20 dez 2007

Este post é muito util, porém como o componente que recebe o texto do memo é um label, ele não tem quebra de linhas. No BD está gravado com os caracteres de quebra de linha, mas o problema é que qdo mostrado no label fica uma coisa só... tudo sem quebras de linhas. Alguém tem alguma sugestão???

Eu vi num outro post o seguinte

#Código


<asp:Label ID="lblTexto" runat="server"

CssClass="corpo_texto1" Text=´<¬# replace(eval("TEXTO_CATEGORIA"),vbcrlf,"<br />") ¬>´

Width="381px"></asp:Label>


Mas na hora da execução não aceita esta função ´replace´. Então não sei como implementar esta parte pois ainda sou iniciante no asp.net.

Obrigado


Toninhonunes
   - 20 dez 2007

Eu vi num outro post o seguinte

#Código


<asp:Label ID="lblTexto" runat="server"

CssClass="corpo_texto1" Text=´<¬# replace(eval("TEXTO_CATEGORIA"),vbcrlf,"<br />") ¬>´

Width="381px"></asp:Label>


Mas na hora da execução não aceita esta função ´replace´. Então não sei como implementar esta parte pois ainda sou iniciante no asp.net.

Obrigado

Não estou bom o BDS agora, mas a função replace deve existir no Delphi, então tem algo ali que está faltando, não testei, vou chutar aqui pra você.

#Código

<asp:Label ID="lblTexto" runat="server"

CssClass="corpo_texto1" Text=´<¬ replace(DataBinder.eval(Container, "DataItem.TEXTO_CATEGORIA"),vbcrlf,"<br />") ¬>´

Width="381px"></asp:Label>


No Vb deve ter replace, não lembro se no delphi o nome é esse, mas tem algo parecido que pode usar sem problemas.

Toninho Nunes