Jump to content


Nicholas Pufal

Member Since 15/11/2002
Offline Last Active Private
*****

Topics I've Started

Problemas Na Comunicação De Uma Classe Com Outra

29/03/2010, 16:16

Estou começando em AS3, e já esbarrei no primeiro problema.

Não consigo fazer a minha classe moduleButton se comunicar com a main.

Tenho um método público na classe moduleButton, e quero chamar ele na classe main (já dei import nesta classe), porém sempre que vou rodar o programa, no debugger aparece:

1180: Call to a possibly undefined method getInstance.


Mas o método existe, e é público!

Seguem os 2 AS

main
package classes
{
	
	import classes.moduleButton;
    import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.display.StageScaleMode;
    import flash.display.StageDisplayState;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	public class main extends MovieClip
	{
		private var myLoader : URLLoader;
		private var myRequest : URLRequest;
		private var xmlData : XML;
		private var numberOfSlides : Number;		
		
		
		public function main()
		{
			stage.displayState = StageDisplayState.FULL_SCREEN;
			stage.scaleMode = StageScaleMode.EXACT_FIT;
			displayStage();
		}
		
		private function displayStage():void
		{
			if (getInstance())
			{
				trace("CLICOU");
			}
			else
			{
				trace("EM BRANCO");
			}
		}
		
		public function XMLLoad():void
		{
			myLoader = new URLLoader();
			myRequest = new URLRequest("xml/modules.xml"); 

			myLoader.load(myRequest);			
			myLoader.addEventListener(Event.COMPLETE, XMLLoaded);
		}
		
		public function XMLLoaded(event:Event):void
		{

			xmlData = new XML(event.target.data);	
	
			numberOfSlides = xmlData.module[getInstance()].*.length();
				
			for (var n : Number = 0;n < numberOfSlides; n++) //percorre todas laminas do respectivo modulo
			{
				trace("Lamina: " +  xmlData.module[getInstance()].slide[n].name);
			}
		}
	}
}



moduleButton
package classes
{
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	
	public class moduleButton extends MovieClip
	{
		private var _instance : *;
		
		public function moduleButton()
		{
			this.buttonMode = true;
			this.addEventListener(MouseEvent.ROLL_OVER,animIn);
			this.addEventListener(MouseEvent.ROLL_OUT,animOut);
			this.addEventListener(MouseEvent.CLICK,setInstance);
		}
		
		private function animIn(e:MouseEvent):void
		{
			this.alpha -= .3;
		}
		
		private function animOut(e:MouseEvent):void
		{
			this.alpha = 1;
		}
		
		private function setInstance(e:MouseEvent):void
		{
			_instance = e.target.name.toString();
			_instance = _instance.substr(6);	
			_instance = Number(_instance);
		}
		
		public function getInstance():Number
		{
			return _instance;
		}
	}
}

Alguma idéia do por que não conseguir chamar o método getInstance na classe main?

O que eu quero é receber a informação do que foi clicado (e essa informação eu recebo na classe moduleButton), e passar ela para o meu método XMLLoad -> XMLLoaded, que existe na classe main.

Ah, e a classe moduleButton é associada com meus botões que são movieClips (linkage).

A main é a classe principal do meu projeto.


obrigado (y)




E-commerce - Ssl E Integração Operadoras

09/10/2009, 15:05

Estou iniciando no desenvolvimento de soluções para comércio eletrônico, e se possível gostaria de algumas orientações/dicas.

Onde encontro a documentação para integrar meu sistema e o Gateway da VisaNet/Master...? Eu procurei no site das operadoras, e nada encontrei... Para aqueles de plantão que já o fizeram, como se dá isso? É complicado? Exige muito trabalho despendido?

A outra dúvida é relacionada com a de cima. Eu preciso obrigatoriamente de encriptação (SSL/TLS) das informações? Caso sim, tais licenças não são demasiadamente caras, inviabilizando o projeto para clientes com não tanta verba?

Enfim, qualquer orientação daqueles que já participaram de projetos assim, já me auxilia bastante ;)

Valeu (y)

Modelo De Negócios, Agregação, Composição E Outros Conceitos

29/09/2009, 17:44

Há tempos que venho lendo alguns livros sobre POO.

Um termo comumente utilizado é o de "modelo de negócios" (business model). No caso de uma aplicação baseada em MVC, a parte do "model" seria o business model. Até aí todos dizem, maravilha... Agora, o que seria de fato "modelo de negócios"? Eu ainda não achei uma explicação simples para isso. Em alguns casos parece que tem ligação com a requisição dos dados de um BD (no caso do MVC), enquanto que em outros dá a entender que é a lógica de negócio específica de uma aplicação, como por exemplo: em uma dada loja, é preciso implantar um sistema onde o valor do produto terá uma quantia de 10% agregada, que é a comissão do vendedor - estes casos específicos de cada negócio, são os que definem um modelo de negócios?

Outro item em que ainda tenho muita dúvida é em identificar uma composição e uma agregação. A teoria é barbada: na composição existe contenção, ou seja, assim que o pai é destruído, o filho também o será. No caso da agregação isso não acontece, visto que o objeto "parte" é instanciado de forma independente do "todo".

Agora, neste caso aqui, o que seria?

$venda = new Venda(3,new Produto(9.68,"Meu produto",3));

Eu considero como composição, visto que se o objeto venda for destruído, o objeto Produto também o será... Mas já vi livros dizendo que isso é agregação :wacko: Alguém pode clarificar isso?

Outra coisa, já vi isso:

$produto = new Produto();
$produto->quantidade = 3;
$produto->id = 2;
$produto->nome = "Meu produto"

$venda = new Venda(3,$produto);

Ser declarado como uma composição... E não como uma agregação (que para mim parece ser mais coerente, seguindo os conceitos).

Alguém dá uma forcinha? :click:

Valeu! (y)

O Que é Type Casting?

24/09/2009, 16:18

Já vi aqui no fórum alguns comentando, e após ler no manual do PHP fiquei um pouco confuso.

PHP does not require (or support) explicit type definition in variable declaration;


No manual diz que o PHP não aceita e não necessita a declaração dos tipos das variáveis. Beleza. Logo mais abaixo explica type casting através de alguns exemplos. Se type casting não é definir o retorno de uma variavel, então o que é?

[]'s (y)

Troca De Idéia - Classe Para Upload

21/09/2009, 14:32

Pessoal,

tô fora do circuito há algum tempo, e só agora tô pegando pesado no assunto POO.

Estive vendo diversas classes de resize (c/ métodos para thumb, resize da original, crop e afins...) e reparei que todas "pecam" em ter que introduzir uma boa porção de códigos para suportar múltiplos uploads. Decidi começar o desenvolvimento de uma classe mais eficaz neste ponto, visto quase sempre o upload ser múltiplo.

Não tenho nenhum super poder em POO, e já esbarrei em um complicador que é ter que fazer um laço em cada método, para que ele seja aplicado a cada item do vetor $_FILES.

Alguém já tentou fazer uma implementação neste sentido?

A idéia (para upload já está funcionando) é aplicar a classe de forma bem simples, assim:

if (isset($_POST['submited']))
{

  $file = new UploadPictures($_FILES['pictures']);
  $file->moveFiles();
  echo $file->getErrors();
  
}

A idéia de pegar e transformar o vetor $_FILES em outro, foi do Paulo André (ou Paulo Ricardo, não lembro ao certo). Eu apenas adaptei o raciocínio um pouco pq tinha um pequeno bug (os arquivos tinham que ser enviados em ordem correta).

A classe é esta: (apenas o construtor e os métodos moveFile() e getErrors() que estão funcionando no momento)

<?php

/*
* @author Nicholas Pufal
*/

class UploadPictures 
{
  private $security = array('allowed_types' => array('jpg','gif','png'));
  private $files = array();
  private $errors = array(); 

  private $dest_upload_dir; 
  private $dest_path; 
  
  public function __construct($spfiles, $dest_upload_dir = 'uploads/', $dest_extension = 'jpg')
  {
	$total_files = count($spfiles['name']); 
	$counter = 0;
	
	for ($i=0;$i<$total_files;$i++)
	{
	  if (!empty($spfiles['name'][$i]))
	  {
		$this->files[$counter]['name'] = $spfiles['name'][$i];
		$this->files[$counter]['extension'] = strtolower(pathinfo($spfiles['name'][$i],PATHINFO_EXTENSION));
		$this->files[$counter]['tmp_name'] = $spfiles['tmp_name'][$i];
		$this->files[$counter]['new_name'] = $this->getNewName(). '.' . $dest_extension;
		list($this->files[$counter]['width'],$this->files[$counter]['height']) = getimagesize($spfiles['tmp_name'][$i]);
		$this->files[$counter]['size'] = $spfiles['size'][$i] / 1048576; //convert to megabytes
		
		//$this->files[$counter]['type'] = $spfiles['type'][$i];
		//$this->files[$counter]['error'] = $spfiles['error'][$i];
		
		$counter++;
	  } 
	}
	
	//$this->debugger($this->files);
	$this->dest_upload_dir = $dest_upload_dir;
  }
  
  private function getNewName()
  {
	return md5(time() * mt_rand(1,9));
  }

  /*
  * Salva a imagem enviada (sem alterações), caso ela esteja de acordo com as extensões suportadas.
  * @return bool
  */  
  public function moveFiles()
  {
	foreach($this->files as $k => $v)
	{
	  if ($this->securityCheck($v['extension'],$v['size'],$v['name'],$k))
	  {
		if (move_uploaded_file($v['tmp_name'],$this->dest_upload_dir.$v['new_name']))
		{
		  echo $v['name']. "-> o upload foi concluído com êxito!<br/>";
		}
	  }
	}
  }
  
  private function createResource($ext)
  {
	switch ($ext)
	{
	  case "jpg" :
		return imagecreatefromjpeg($this->dest_path);
		break;
	  case "jpeg" :
		return imagecreatefromjpeg($this->dest_path);
		break;
	  case "png" :
		return imagecreatefrompng($this->dest_path);
		break;
	  case "gif" :
		return imagecreatefromgif($this->dest_path);
		break;
	  default:
		$this->errors[] = "Não foi possível criar um resource para a imagem.";
		break;
	}	
  }
  
  public function createThumb($dest_width = 500, $dest_height = 350, $quality = 80)
  {
	if (file_exists($this->dest_path))
	{
	  $dst_image = imagecreatetruecolor($dest_width, $dest_height);
	  
	  $src_resource = $this->createResource($this->src_extension);
	  
	  imagecopyresampled ($dst_image , $src_resource, 0, 0, 0, 0, $dest_width, $dest_height, $this->src_width, $this->src_height);
	  
	  imagejpeg($dst_image,$this->dest_upload_dir.'thumb_'.$this->getNewName(). $this->dest_extension/*alterar*/, $quality);	  
	}
  }

  private function securityCheck($extension,$size,$name,$k)
  {
	$arr_keys = array_keys($this->security);
	
	//Supported extensions
	if (in_array('allowed_types',$arr_keys))
	{
	  if (!in_array($extension,$this->security['allowed_types']))
	  {
		$this->errors[$k][] = $name ." -> Extensão ".$extension." não é permitida.";
	  }
	}
	
	//Max size
	if (in_array('max_size',$arr_keys))
	{
	  if ($this->security['max_size'] < $size)
	  {
		$this->errors[$k][] = $name ."-> O arquivo ultrapassa o tamanho limite de ".$size;
	  }
	}	
	
	return (empty($this->errors[$k])) ? true : false;
  }
  
  /*
  * Getters and other non-essential methods
  */
  
  private function debugger($f)
  {
	echo "<pre>";
	var_dump($f);
	echo "</pre>";
  }
  
  public function getErrors()
  {
	if (!empty($this->errors))
	{
	  $error = '';
	  
	  foreach($this->errors as $er)
	  {
		foreach($er as $v)
		{
		  $error .= $v."<br/>";
		}
	  }
	  
	  return $error;
	}	
  }
}
?>

(y)

IPB Skin By Virteq