Ultimas Entradas »
Ultimos Comentários »
Entradas Populares »

Flex Sistema Imobiliário - Detalhes do Código

Escrito por Mário Santos on Abril 2, 2008 – 7:42 am

A pedido do José Carlos Fonseca, aqui ficam algumas explicações e detalhes de partes de código usadas no meu sistema imobiliário, assim ajudo-o e posso ajudar mais gente interessada.

P: 1.Na primeira página surge uma imagem “loading” com efeito como fazes?

R: 1. O efeito loading é conseguido atravéz da substituição do “loader” normal do flex por uma imagem, podes ver aqui http://www.onflex.org/ted/2006/07/flex-2-preloaders-swf-png-gif-examples.php onde encontras gif, png, swf e exemplos com código fonte. Basta copiares para a pasta da tua aplicação e no <mx:Application …> colocares preloader=”preload.CustomPreloader”. Eu fiz umas pequenas implementações baseadas nesse exemplo, mas se se usar assim funciona na mesma.

P:2.Pagina de login: efeito de erro, “checking login” e a barra azul

R: 2.A barra azul é uma progressBar:

1: <mx:ProgressBar visible=”false” x=”112″ y=”175″

2: labelPlacement=”left” label=” “ width=”187″

3: indeterminate=”true” showEffect=”{Fade}” hideEffect=”{Fade}”

4: id=”progressStatus”/>

que é activada (progressStatus.visible=true;) quando inicias o pedido para verificar o login no remoteObject (send) e desactivada quando recebes a resposta do remoteObject (result). (progressStatus.visible=false;)

quando recebe o resultado (negativo, o user e pass não condizem) faz o seguinte:

blurRed.target=panelLogin;

blurRed.play();

onde o panelLogin é o nosso panel de login e o blurRed é o seguinte efeito :

1: <mx:Glow id=”blurRed” duration=”700″

2: alphaFrom=”1.0″ alphaTo=”0.0″

3: blurXFrom=”0.0″ blurXTo=”20.0″

4: blurYFrom=”0.0″ blurYTo=”20.0″

5: color=”0×990000″ />

Quanto ao checking login é o mesmo sistema que em cima, activar ou desactivar a progressStatus já que o Flex ainda não implementa o remoteObject com um event progress.

P:3.Pagina principal: efeito nos botões no lado esquerdo

R:Quanto aos botões do lado esquerdo, o efeito passa pelo mesmo do erro do painel login, os efeitos são:

1: <mx:Glow id=”blurBlueIn” duration=”700″

2: alphaFrom=”1.0″ alphaTo=”0.0″

3: blurXFrom=”0.0″ blurXTo=”20.0″

4: blurYFrom=”0.0″ blurYTo=”20.0″

5: color=”0×900aeef” />

6: <mx:Glow id=”blurBlueOut” duration=”700″

7: alphaFrom=”0.0″ alphaTo=”1.0″

8: blurXFrom=”20.0″ blurXTo=”0.0″

9: blurYFrom=”20.0″ blurYTo=”0.0″

10: color=”0×00aeef” />

e no botão basta chama-los nos events mouseOver mouseOut:

1: <mx:Button width=”85″ height=”73″ label=”button ADD” id=”add”

2: icon=”@Embed(source=’imgs/Home_add.png’)” x=”10″ y=”91″

3: fillColors=”[#000000,#000000]“ fillAlphas=”0″ borderColor=”#525151″

4: color=”#FDFBFB” themeColor=”#535C75″ textRollOverColor=”#2667B0″

5: useHandCursor=”true” mouseOver=”{buttonOver(add)}”

6: mouseOut=”{buttonOut(add)}” click=”{changeTo(’bsf1′)}”

7: buttonMode=”true”/>

onde tens: a função buttonOver(id_do_botão) e buttonOut(id_do_botão):

1: private function buttonOver(a:Button):void{

2: blurBlueOut.target=a;

3: blurBlueOut.play();

4: }

5: private function buttonOut(a:Button):void{

6: blurBlueIn.target=a;

7: blurBlueIn.play();

8: }

e tens os teus efeitos feitos :P

P:4.Como adicionas uma foto na BD?

R:A foto é adicionada através do php via amfphp, no Flex apenas são seleccionadas as fotos e enviadas via post para um script upload.php que trata do envio para o servidor, e devolve as localizações das fotos que ficam guardadas num array, quando termina de enviar todas as fotos, é chamada uma função do remoteObject que guarda os caminhos das fotos na base de dados (optei por usar caminhos relativos em vez de colocar a foto directamente na base de dados, ja que as fotos podem ser de grande tamanho o que ia encher a base de dados).

Quanto ao sistema de upload, podes ver aqui um sistema parecido com o que fiz (com código):

http://weblog.cahlan.com/files/file_uploads/FileUpload.html

onde o upload.php será algo parecido com: http://www.msdevstudio.com/mywork/upload.rar

P:Agora fora da tua aplicação, eu tenho uma tabela com varios itens e quero que apareçam numa pagina cada um como botão, é possível?? E no caso de essa pagina ter um numero predefinido de botões como fazer paginação?

R: Agora o monstro das respostas (nota que escrevi isto sem testar, terás que alterar muitos dos campos, mas o essencial está lá: )

Parte I: Botões em cada elemento da “tabela”

Quanto aos botões, podes colocar em cada linha da datagrid ou qualquer elemento de listagem um qualquer outro componente, sendo o mais comum, checkbox, listbox, button ou radioButton, ve isto:

http://www.returnundefined.com/files/ItemRendererExample/ (codigo fonte)

http://www.adobe.com/devnet/flex/quickstart/using_item_renderers/

mesmo parecido com o que deves querer:

http://axel.cfwebtools.com/…/UsingTheItemRendererWithADataGrid.html

Estes links têm o view source activo.

Parte II: E no caso de essa pagina ter um número predefinindo de botões como fazer paginação?

Qaunto a fazer a paginação, isso depende muito do tipo de sistema que tens, se tens php+mySql podes limitar (LIMIT) a listagem a apenas o que queres, basta criares uma variavel publica para guardares a iniciação da listagem e outra com o número de entradas por pagina:

1: public var inicio:Number = 0;

2: public var porPagina:Number = 10;

3: //ao ser chamado o Remote objecto, tens que dizer ao php para contruir o pedido sql com as limitações.

4: //no flex por exemplo o botão seguinte e o anterior a chamarem a Função goPag(”seguinte”); ou goPag(”anterior”); (consoante o botão.)

5: private function goPag(onde:String):void{

6: if(onde==“seguinte”) {

7: inicio=inicio+10;

8: }

9: if(onde==“anterior”) {

10: inicio=inicio-10;

11: if(inicio<=0) inicio=0;

12: }

13: remoteObjectBusca.funcaoBusca.arguments.inicial=inicio; //redefinimos os valores

14: remoteObjectBusca.funcaoBusca.arguments.porPag=porPagina; //redefinimos os valores

15: remoteObjectBusca.funcaoBusca.send();

16: }

onde o remoteObject será algo como (amfphp):

1: <mx:RemoteObject id=”remoteObjectBusca” destination=”amfphp” source=”servico.class”>

2: <mx:method name=”funcaoBusca” result=”{lidaDados(event)}”>

3: <mx:arguments>

4: <inicial>

5: {”0″}

6: </inicial>

7: <porPag>

8: {”10″}

9: </porPag>

10: </mx:arguments>

11: </mx:method>

12: </mx:RemoteObject>

e onde a função do remote object em php receberá esses parametros e devolverá a matriz de dados (as Object):

1: function funcaoBusca($inicial, $porPag) {

2: if(!inicial || $inicial==NULL) $inicial=0;

3: if(!porPag || $porPag==NULL) $porPag=10;

4:

5: $con=mysql_connect(“host”,“user”,“pass”);

6: $sel=mysql_select_db(“Bdados”);

7: 

8: $sql=“SELECT * FROM `tabelaDados` LIMIT “.$inicial.“, “.$porPag;

9: $res=mysql_query($sql);

10: 

11: if($res) return mysql_fetch_array($res);

12: else return “Error”;

13: }

depois só temos que criar no flex a funçâo para ler os dados:

1: [Bindable]

2: public var dadosBusca:Object;

3: pivate function lidaDados(event:ResultEvent):void {

4: if(event.result==“Error”) {

5: //erro ao buscar os dados

6: }

7: else dadosBusca=event.result as Object;

8: // a partir daqui tens os dados acessiveis na variavel dadosBusca

9: // para acederes a cada elemento usas dadosBusca[linha].campoDaBd;

10: }

Nota: Este código da ultima resposta foi elaborado sem ter sido testado, por isso não sei se contem alguns erros.. mas basta testares, não sei se seria bem isto que querias.

Bom, acho que consegui explicar tudo.. dá para perceber?

Coloquei as respostas num novo post, já que era uma resposta enorme, e assim pode ajudar mais gente.

Abraço.




Colocado em Action Script & MXML, Duvidas, Flex, PHP, RIA's Geral, Source Code, Tutoriais |

39 Comentários ao “Flex Sistema Imobiliário - Detalhes do Código”

  1. José Carlos Fonseca Diz:

    Olá,

    Desculpa de só agora responder, mas estive fora por uns tempos em trabalho e só voltei ontém.

    Muito obrigado, pela ajuda. E que rapidez na resposta. Mais uma vez obrigado.

    Na resposta à pergunta 4 (Como adicionas uma foto na BD?), mencionas um link, já estive a analizar o código, mas dá-me sempre “IO ERROR”. Não sei como usar o upload.php.

    Ajudas-me??

    Um abraço.

    José Carlos Fonseca
    Fafe - Portugal

  2. Mário Santos Diz:

    Em principio o upload.php que dei para download deve funcionar sem qualquer alteração, verifica se os links que fazem referencia ao upload.php estão bem:

    private const _strUploadDomain:String = “http://codycodingcowboy.cahlan.com/”;
    private const _strUploadScript:String = _strUploadDomain + “files/upload.php”;

    e na directoria onde é executado o .php deves ter a directoria myFileDir já que no tal upload.php está:

    $file_path = $_SERVER['DOCUMENT_ROOT'].”/myFileDir”;

    se depois destas verificações continuar a dar erro, me indica se fez algumas alterações ao código para poder “investigar” melhor. :)

    cumps.

  3. José Carlos Fonseca Diz:

    Olá Mário,

    De facto não tinha o upload.php no directorio certo e não tinha a directoria. Depois de resolver isto já não me dá erro. Confirma o upload da imagem e envia para o local. No entanto a verificação se a imagem já existe não faz. Vou tentar vêr onde está o problema.

    Na bd guardas o caminho todo da imagem, certo?

    Agora outra questão, (espero não ser chato!!!).

    Como mostro 1 registo da bd directamente num textinput sem ser num datagrid?

    Obrigadão pela ajuda.

    Tens sido fantástico.

    Um abraço.

    José Carlos Fonseca
    Fafe - Portugal

  4. Mário Santos Diz:

    Sim, na base de dados guardo o caminho da imagem já que são muitas imagens e iria sobrecarregar a base de dados.

    para mostrar um registo directamente na base de dados num campo de texto podes fazer o seguinte, imagina a função seguinte (que recebe dados do remoteObject):
    imagina que o teu remote object devolve (exemplo em php+amfphp)
    < ?php

    function dev() {
    //exemplo 1
    return "Ola";

    //exemplo 2
    $dados['nome']="soares";
    $dados['prenome']="joão";
    return $dados;

    //exemplo 3
    $dados['antonio']['nome']="sousa";
    $dados['antonio']['idade']="19";
    $dados['pedro']['nome']="lemos";
    $dados['pedro']['idade']="25";

    }

    ?>
    private function lidaDados(ev:ResultEvent):void {
    //exemplo 1, recebe apenas uma variavel:
    meucampo.text=ev.result

    //exemplo 2, recebe um array de variavels:
    meuCampo.text=ev.result.nome; //devolve soares
    meuCampo.text=ev.result.prenome; //devolve joão

    //exemplo 3, recebe uma “matriz” de arrays:
    meuCampo.text=ev.result.antonio.nome; //devolve sousa
    meuCampo.text=ev.result.antonio.idade; //devolve 19
    meuCampo.text=ev.result.joao.nome; //devolve lemos
    meuCampo.text=ev.result.joao.idade; //devolve 25

    }

    Para facilitar este processo, cria uma variavel bindable:

    [Bindable]
    public var DadosRo:Object;

    e depois na função que recebe os dados do RO, coloca

    DadosRo=new Object();

    DadosRo = ev.result as Object;

    e a partir daí os seus dados podem ser acedido a partir dessa variavel em qualquer parte do seu código, e serão actualizados sempre que o remoteObject for chamado.

    No exemplo 3:
    em vez de meuCampo.text=ev.result.joao.nome;

    poderia usar:
    meuCampo.text=DadosRo.joao.nome;

    Deu pra perceber??

    Abraço.

    Bom, eu não sei se tem seguido a minha série de tutoriais ( http://msdevstudio.com/blog/2008/04/08/adobe-flex-a-partir-do-zero-parte-iv/ ) mas na quarta parte exemplifico um bocado do sistema de comunicação com um backend em php, talvez te possa ajudar a compreender melhor alguns promenores do Flex.

  5. José Carlos Fonseca Diz:

    Boas Mário,

    Simplesmente genial. Funcionou direitinho.

    Sim!! Tenho seguido todos os teus tutoriais, estão de mais. Se não fosse você concerteza a aprendizagem do flex iria ser mais demorada. Grande ajuda, Obrigado!!

    (lá vem o chato!!!) Outra questão, eu tenho um viewStack onde para cada um item é um component. Estes components são accionados por um botão, acontece que depois de visitar uma vez, na proxima visita não faz o refresh.
    É possivel contornar isto?

    Se quiseres, podes adicionar o meu email ao messenger.

    Mais uma vez obrigado.

    José Carlos Fonseca
    Fafe - Portugal

  6. Mário Santos Diz:

    Carlos, desculpa só responder agora.. tenho andado um pouco atarefado com trabalo :p e se calhar por isso não percebi bem a sua duvida, se o código não for muito extenso coloque aí..senão tente explicar mais detalhadamente.. :P

    um abraço.

  7. José Carlos Fonseca Diz:

    Olá Mário, desde já obrigado pela resposta e não tens que te desculpar.
    EStive a rever o meu código e acho que já descobri o erro.
    No entanto gostaria de te colocar outra questão, estou a tentar fazer algo que irá ter acesso atravéz de login. Como é que mostro o ecrã1 para o administrador, o ecrã2 para o utilizador, etc. Já tentei, mas acho que ainda estou verde em flex.

    Obrigado.

    Um Abraço.

    José Carlos Fonseca
    Fafe - Portugal

  8. Mário Santos Diz:

    Bem Carlos, podes fazer isso de 2 maneiras, agora depende da necessidade ou não de usares um backend (php, java, etc..)

    Sem Backend.
    A solução pode passar por definires uma variavél global, ou seja, declaras a variavél, por exemplo
    var admin:Boolean = false;
    E depois, basta verificares sempre essa variavel quando é pedido acesso à parte de admin.

    O ideal será separares a tua aplicação por pelo menos 3 states; Login, Admin, User
    Depois basta fazeres o login, e na funçao que valida o login definires a variavél admin=true; e mudares pro state respectivo, neste caso currentState=”Admin”; ou se for user, admin=false; currentState=”User”;

    Outra forma de fazer isso, é usares um backend em php por exemplo, e fazeres uso de sessões, para verificares se o user está identificado como admin ou não… mas assim é um bocado mais extenso, mas se vires que é a melhor forma, diz que eu faço-te um pequeno exemplo.

    Seria isso que querias?

    Abraço.

  9. José Carlos Fonseca Diz:

    Bom dia Mário,

    De facto o ideal seria criar um backend em php e usar sessões. Arranjas-me então um exemplo.

    Obrigado.

    Abraço.

    José Carlos Fonseca
    Fafe - Portugal

  10. José Carlos Fonseca Diz:

    Olá Mário,

    No teu Sistema Imobiliário a caixa de login não é um popup pois não. Usas-te states?? Tentei fazer o efeito, mas a caixa não surge desde cima e não consigo fazer o efeito final.

    Na aplicação que estou a tentar fazer acontece algo do género:

    - faço o login, entro em vários ecrãs e faço logout sem fechar o browser. Ao fazer login outra vez entra no último ecrã que estive e não no que está programado para aparecer e os efeitos só são feitos na primeira vez.

    - E se estiver dentro da aplicação e fizer F5(refresh) sai e pede para fazer login.
    Isto é normal? Dá para contronar.

    Obrigado pela tua ajuda e paciência.

    Um abraço.

    Jose Carlos Fonseca
    Fafe - Portugal

  11. Mário Santos Diz:

    Bem carlos, o efeito inicial é um simples painel, que é criado no topo da aplicação com visibilidade=false; depois do efeito iniciado é mostrado.
    O efeito final é um simples mx:Move (como o inicial), ambos com a easingFunction=Elastic (mx.effects.easing.Elastic ) e depois visibility=false; quando o efeito termina (podes saber quando o efeito termina, com um eventListner ao efeito, algo como efeito.addEventListener(EffectEvent.EFFECT_END, funcao_que_esconde_o_panel);

    na funcao:
    private function funcao_que_esconde_panel(evt:EffectEvent) {
    painel_login.visibility=false;
    efeito.removeEventListner(EffectEvent.EFFECT_END, funcao_que_esconde_o_panel);
    }

    Se fizeres isso com eventos, deves remover os eventListners…

    Quando voltas a fazer o login de novo, na função que verifica a validade do login, indica para ele voltar ao state que queres com a indicação. this.currentstate=”StateEntrada”;

    Ao fazeres o F5 é normal isso acontecer, o que podes fazer, é com a tal sessão, verificar isso logo na entrada, no login, e se a sessão for válida ele vai directo ao State desejado, não mostrando o painel de login, já que a sessão é mantida quando carregas no F5. Este fim de semana não devo ter muito tempo pra te fazer um exemplo, mas assim que possa eu faço.

  12. José Carlos Fonseca Diz:

    Boa tarde Mário,

    Podes dar-me uma ajuda?

    Após inserir em alguns textinputs, queria que os dados surgissem num datagrid sem gravar na BD. E gravar na BD, atraves de um botao, gravar tudo o que estiver na mesma DataGrid.

    Obrigado.

  13. Mário Santos Diz:

    Carlos, o aconselhado é criar um ArrayCollection, e trabalhar todos os seus dados nele, que tanto serve como dataProvider para a dataGrid, bem como para depois o enviar para a base de dados.

    Tenho um exemplo no blog que explica como um arrayCollection pode servir para trabalhar com os dados na base de dados.

    veja: http://msdevstudio.com/blog/2008/03/25/flex-datagrid-operaes-no-dataprovider/

    Quanto ao gravar na base de dados, enviar esse arrayCollection como parametro para o remoteObject.
    Ve o exemplo, se não conseguires fazer, coloca as tuas duvidas ;)

    Abraço.

  14. José Carlos Fonseca Diz:

    Olá Mario,

    já tenho um arrayCollection com os dados.

    no remoteObject seria assim?

    {dados}

    em que “dados” é o meu arrayCollection.

    E no PHP como é que seria para inserir na tabela uma vez que o arrayCollection tem a seguinte estrutura:

    dados = ["campo1, campo2, campo3"
    "campo3, campo4, campo5"]

    Obrigado!

    José Carlos Fonseca
    Fafe - Portugal

  15. Mário Santos Diz:

    Boas! :-)
    Ora então, considerando a seguinte funçao no php

    function insere($dados){

    $sql=”INSERT INTO `table` (`campo1`, `campo2`, `campo3`, `campo4`, `campo5`, `campo6`) VALUES (’$dados[0][campo1]‘, ‘$dados[0][campo2]‘, ‘$dados[0][campo3]‘, ‘$dados[1][campo4]‘, ‘$dados[1][campo5]‘, ‘$dados[1][campo6]‘)”;

    if(mysql_query($sql)) return “ok”;
    else return “error :”.mysql_error();

    }

    depois basta chamar a funçao no remote object, algo como um metodo assim no

    mx:remoteObject …resto…como target, detination..>
    mx:method name=”insere” result=”insereRes(event)” >
    mx:arguments>
    dados>
    {dados}
    /dados>
    /mx:arguments>
    /mx:method>
    /mx:remoteObject>

    p.s. faltam as “< ” no inicio de cada linha, porque para colocar o código tem que ser assim!

    Isto deve resolver a tua questão… :)

    Um arrayCollection é tratado como um array de arrays no php, ou a tipica matriz (grelha de dados) e um simples Array é tratado como array…

    Esperimenta e diz como correu….

  16. José Carlos Fonseca Diz:

    Olá Mário,

    Estive ausente por uns dias por isso é que só agora respondo.

    Funcionou impcável! Obrigado.

    Estou a tentar controlar os campos textinput antes de enviar os dados para o datagrid. Só me falta um teste que não estou a conseguir.

    Verificar se o que inserir no textinput já existe no datagrid. Podes dar-me uma ajuda?

    Obrigado.

    José Carlos Fonseca
    Fafe - Portugal

  17. Mário Santos Diz:

    private function existe(texto:String):Boolean {

    var existeV:Boolean;

    existeV=false;
    for(var x:int=0; x<meuDataProvider.lenght; x++) {

    if(String(meuDataProvider[x].campo_a_comparar)==texto) existeV=true;

    }
    return existeV;
    }

    para verificar basta usares
    if(existe(String(meu_text_imput.text))=true) { //existe }
    else //não existe.

    Nota que não testei, mas deve funcionar sem problemas.

    Seria isso?
    Abraço.

  18. José Carlos Fonseca Diz:

    Boas Mário,

    Perfeito! O meu erro era que não estava a passar para String na condição IF.

    Mais um pedido de ajuda:

    Tenho em tabelas dados hierarquizados, ou seja, equipamentos->marcas->modelos
    EX: Monitores -> ELOTouch -> 15 Polgadas

    Criar um ecrã para mostrar estes dados o melhor, acho eu, seria atraves de um TreeControl + datagrid.

    No TreeControl aparecia Monitores -> ELOTouch -> 15 Polgadas e no dataGrid os vários dados do respectivo equipamento(nº de serie, cadastro, data, etc)

    Será muito trabalhoso fazer isto? Por acaso tens algum exemplo por onde eu possa guiar? Ainda não encontrei nada na net.

    Obrigado.

    José Carlos Fonseca
    Fafe - Portugal

  19. Mário Santos Diz:

    Bem, realmente os exemplos que se vêm são todos em MXML ou XML também por isso nunca trabalhei com as Tree’s, mas olha para este exemplo:

    http://blog.flexexamples.com/2007/12/03/using-an-array-as-a-data-provider-in-a-flex-tree-control/

    como dataProvider tem um Array de objectos, isto pode ser recriado em action script e depois só tens que mandar o output do php no mesmo formato, que se já estás a mandar correctamente para o flex, deve servir sem problemas, mas tens que construir os teus dados no php como objectos…

    $array['dados']->nome=campoCategoria;
    $array['dados']->conteudo[0]->valor1=Campo1;
    $array['dados']->conteudo[1]->valor2=Campo2;

    mas se eu encontrar algum exemplo eu aviso….

    Abraço.

  20. Mário Santos Diz:

    Nem de proposito, ve aqui:

    http://www.adobe.com/devnet/flex/quickstart/working_with_tree/

    junto ao final da pagina tem a criação de um dataProvider para a tree, basta em php usares a mesma estrutura de dados.

    o código fonte está em:
    http://www.adobe.com/devnet/flex/quickstart/working_with_tree/src/TreeKeepOpen/index.html

    Abraço.

  21. José Carlos Fonseca Diz:

    Ok, já vou ver e depois digo alguma coisa.

    Já agora: na expressão
    if(String(dados[x].campo)==texto) existeV=true;

    a palavra campo é uma variavel(string) que recebe 3 valores. Conforme está nao funciona pois campo nao pertence a dados. Como resolver?

    Abraço.

  22. José Carlos Fonseca Diz:

    olá Mario,

    Deparei com uma situação. eu tenho vários components que começam assim:

    a função init() tem uns efeitos e chama um remoteObject.

    Estes components são chamados por botoes e na primeira vez que são chamados a função init funciona a partir da segunda vez inclusivé a função não faz nada. Nem efeitos nem remoteObject.

    Estou a fazer algo de errado??

    Obrigado.

    Abraço.

  23. José Carlos Fonseca Diz:

    Desculpa,

    os componets começam assim:

    Abraço.

  24. José Carlos Fonseca Diz:

    Não sei porquê, mas não está a aparecer a linha de código.

    O component é um titleWindow e tem creationComplete={init()}

    Abraço.

  25. Mário Santos Diz:

    Carlos, o código não aparece por causa dos ‘<’ que o wordpress considera como html.. mas bom, o evento creationComplete é disparado apenas uma vez durante toda a execução do flex.

    Se voce quer chamar esses efeitos e remote object assim que a title window seja adicionada como child, coloca antes o evento added=”init()” no seu title window que chamará a função cada vez que o painel abrir (for adicionado à display list) isto funcionará sempre que o titleWindow for adicionado à display list.

    Não sei se seria isto….mas diz qq coisa…

  26. Mário Santos Diz:

    quanto à duvida anterior:

    Já agora: na expressão
    if(String(dados[x].campo)==texto) existeV=true;

    a palavra campo é uma variavel(string) que recebe 3 valores. Conforme está nao funciona pois campo nao pertence a dados. Como resolver?

    explica melhor, porque percebi que uma string recebe 3 valores?? uma string só pode receber um valor…

    esse campo é suposto ser o o campo do array dados[linha].campo_da_linha…

    mas explica melhor..

  27. José Carlos Fonseca Diz:

    Olá,

    tenho uma variavel campo que conforme os textinputs em que estou recebe o valor a,b, ou c. Estes valores sao campos do array dados. A função é chamada conforme o textinput e para reaproveitar o código uso entao a variavel campo. Se tivesse 3 funcões seriam:

    if(String(dados[x].a)==texto) existeV=true;
    if(String(dados[x].b)==texto) existeV=true;
    if(String(dados[x].c)==texto) existeV=true;

    em vez de repetir tudo substituo a,b e c por campo. Dá para fazer isto ou terei que fazer varios ifs.

    Em relação à questão anterior evento added=”init()” podes dar um exemplo.
    No component eu tenho assim:
    mx:TitleWindow added=”init()” e quando o chamo nem sequer aparece.

    Abraço.

  28. Mário Santos Diz:

    Essa mx:TitleWindow está sempre visivel na tua aplicação?? ou é chamada como child (addChild)? ou é apenas apresentada como visible=true / false ??

    Se estiver sempre visivel, terás que criar uma função:

    public function init():void {

    meuRo.meuServico.send();
    efeitos.target=minhaTitleWin;
    efeitos.play();

    }
    e cada vez que precisares de chamar o RO e os efeitos fazes chamas esta função, podes chamar atravéz de um botão ou qualquer coisa..

    Se o teu titleWindow cada vez que for preciso é adicionado ou removido do stage, o added=”init()” deve funcionar.

    Se apenas usar o titleWindow e vais ocultando ou mostrando conforme precisas dele (com o parametro .visible) usar o show=”init()”

    Tipos de eventos:
    TitleWindow:
    - creationComplete
    —apenas é disparado uma vez durante toda a aplicação.
    - show
    —disparado sempre que o title window fica visible (meuTitleWindow.visible=true; )
    - hide
    —disparado sempre que o title window fica invisivel (meuTitleWindow.visible=false; )
    - added
    —Disparado quando o titleWindow é adicionado como child do stage ou de algum componente (
    this.addChild(com.meuTitleWindowComponente)
    -Removed
    —Disparado quando o titleWindow é removido do stage ou de algum componente ( this.removeChild(com.meuTitleWindowComponente)

    Bom, se não conseguires, manda-me um email (penso que tens o meu email)

    Quanto à duvida dos if’s. se eu percebi bem, penso que podes fazer assim:

    private function existe(campo:String, texto:String):Boolean {

    var existeV:Boolean;

    existeV=false;
    for(var x:int=0; x < meuDataProvider.length; x++) {

    if(String(meuDataProvider[x][campo])==String(texto)) existeV=true;

    }
    return existeV;
    }

    e para verificares sem determinado texto existem em determinado campo fazes:

    var existeRes:Boolean;

    existeRes=existe(”a”, String(textInput.text));
    if(existeRes=true) Alert.show(”EXISTE”);
    else Alert.show(”Não EXISTE”);

    Seria isso?
    p.s. na função que te tinha dado tinha um erro no .lenght deve-se escrever length, esta agora está correcta…

  29. José Carlos Fonseca Diz:

    Olá Mário,

    Já vi o teu email. Optei pela segunda maneira, mas acontece nada. A função init() não é chamada.

    Abraço.

  30. José Carlos Fonseca Diz:

    Olá Mário,

    Tudo bem?

    Dás-me uma ajuda? Tenho um dataprovider (dp) recebido do php para preencger um datagrid.

    Eu queria alterar a cor de background ou do texto de uma row consuante o valor de um item do dp.

    Vê o exemplo:

    ———————————————–
    | A | B | C |
    ———————————————–
    | XPTO1 | XPTO2 | 0 | (L1)
    ———————————————–
    | XPTO3 | XPTO4 | 50 | (L2)
    ———————————————–
    | XPTO5 | XPTO6 | 0 | (L3)
    ———————————————–
    Neste exemplo a row a sofrer alterações seria a row L2 porque C.L2>0.

    Já agora, é possivel associar a L2 uma tooltip?

    Obrigado.

    Abraço.

    José Carlos Fonseca
    Fafe - Portugal

  31. Mário Santos Diz:

    Fiz à pouco tempo o que precisas.. ve este tópico :
    http://msdevstudio.com/blog/2008/05/25/flex-datagrid-mudando-a-cor-de-uma-linhacoluna/

    Tens lá exemplos de utilização..

    quanto ao resto, queres associar o L2 a uma tooltip como? quando passas o rato por cima?? se colocares o showDataTips da coluna em true ele mostra o conteudo dela… será isso?

  32. José Carlos Fonseca Diz:

    Olá Mário,

    Diz-me por favor, alterei o preloader na aplicação que estou a fazer e reparei que a progressBar nunca vai até ao fim, chega a meio e o preloader desaparece. É normal?

    Consegue-se saber quando é que o preloader terminou?

    Obrigado.

    José Carlos Fonseca
    Fafe - Portugal

  33. Mário Santos Diz:

    como é que alteraste o preloader? manda-me um email se quiseres a mostrar o código…e a explicar as tuas duvidas..

    cumps.

  34. José Carlos Fonseca Diz:

    Olá Mário,

    Já mandei o email. Quando puderes diz alguma coisa.

    Abraço.

    José Carlos Fonseca
    Fafe - Portugal

  35. José Carlos Fonseca Diz:

    Mário,

    Acabei de reenviar o email.

    Obrigado

  36. Vilmar Spies Diz:

    Olá, tudo bem…
    estou a analisar sua aplicação e uma coisa que me chamou a atenção foi o cabeçalho… gostei dele e gostaria de saber o que foi que você utilizou para faze-lo…
    algum componente ou uma imagem. Estou a falar da parte onde esta escrito “DEMOIMMO AD…”
    Grato e Obrigado
    Vilmar Spies

  37. Mário Santos Diz:

    Boas Vilmar.

    Esse cabeçalho é constituido por um painel com a cor de bordo e fundo iguais.

    O DEMOIMMO é uma imagem, o resto é texto e o relogio é uma imagem com os campos em texto onde é actualizado o relógio com recurso a um timer disparado segundo a segundo…

    :)

    Cumprimentos.

  38. Vilmar Spies Diz:

    obrigado,
    e sucesso
    :)

  39. José Carlos Fonseca Diz:

    Olá Mário,

    Não recebes-te o meu email? Diz qualquer coisa. No entanto vou reenviar outra vez.

    Aproveito para colocar uma questão:

    Tenho um DataGrid com uma coluna, como faço para contabilizar o número de linhas iguais dessa coluna? É possivel?

    Obrigado.

    José Carlos Fonseca
    Fafe - Portugal

Deixe um comentário