Newsgroup: it.comp.lang.delphi
Titolo: Macro in Delphi

Ciao a tutti,
volevo chiedervi se in Delphi esiste qualcosa di simile alle macro di
FoxPro o del Clipper, dove si utilizzava il simbolo "&" per indicare la
sostituzione delle variabili di memoria all' interno di una striga. Es.:
*********************************************
Foxpro
*********************************************
str1 =  " importoRiga = qta * prezzo"       // inserimento codice in una
stringa
&str1                                                    // esecuzione
stringa 
*********************************************
Clipper
*********************************************
nomeFile = "Clienti"
USE &nomeFile
Grazie a quanti mi vorranno rispondere.
GD
Será que no delphi existe isso:
no foxpro podemos caregar uma variavel com
uma string qualquer, e depois na linha de
programa executamos o valor da variavel
usando o "&" 
ex : 
asd = "list to print"
&asd 
alguem sabe se existe algo semelhante no Delphi?
-- 
Posted from 
dns.struinfo.it
 [194.184.42.10] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

stringa 
non conosco foxpro, cmq se ho capito bene puoi semplicemente usare
delle procedure o funzioni
procedure str1;
begin
 importoRiga = qta * prezzo;  // " inserimento codice "
end;
str1; // esecuzione codice
8)
se intendi usare quella tecnica delle "macro" per cambiare il codice a
runtime in una stringa, allora non lo puoi fare in delphi (è codice
compilato e non interpretato, per fortuna....)
Ciao,
Alan Solo

Alan Solo
Io Foxpro lo conosco. Sono certo che intende proprio la seconda.
Non discuto le performance di un exe rispetto ad un Pcode, ma le macro
č una cosa di cui chi era abbituato ad usarle puň sentire la mancanza.
Non mi sono ancora preso la briga di testarlo, ma per oviare al
problema ho guardato in rete trovando 
http://www.dwscript.com/
che pare sia un interprete delphi.
dall'esempio del sito pare sia in grado di interpretare 
questo. 
QuickSort 
const size = 100;
type TData = array [0 ..size - 1] of integer;
function Partition (var d: TData; i, j: integer) : integer;
var 
  m, tmp: integer;
begin
  m := d[(i + j) div 2];
  while i < j do
  begin
    while d[i] < m do i := i + 1;
    while d[j] > m do j := j - 1;
    if d[i] > d[j] then
    begin
      tmp := d[j];
      d[j] := d[i];
      d[i] := tmp;
    end
    else 
      i := j;
  end;
  Result := i;
end;
procedure QuickSort(var d: TData; i, j : Integer);
begin
  var m : Integer;
  if i < j then
  begin 
    m := Partition (d, i, j);
    QuickSort (d, i, m);
    QuickSort (d, m + 1, j);
  end;
end;
var data : TData;
QuickSort(data, 0, size - 1);
 
 
--------------------------------------
(per cose piů semplici esistono anche numerosi valutatori di
espressione, ma in questo momento non trovo i link)

questo. 
[...]
pensa che in Delphi trovi già il compilatore che ti compila *tutto*
;))))
a parte gli scherzi, spero tu non usi questo interprete seriamente...
8)
Ciao,
Alan Solo

cusriosità ... :)
<<non vedo cose che si possono fare solo con le macro>> Questo, no.
quando non si ha una cosa si trova una soluzione alternativa, ma sono
una comodità.
Esempio 1
La macro interpreta a runtime il codice in formato sorgente
quindi un primo esempio à quando costruisci una stringa
a design time o a runtime da dare in pasto ad un motore SQL
che si occupa di interpretare la stringa. (e questo anche se non sono
ancora arrivato a vedere i componenti per i database mi pare ci sia
anche in delphi come in qualsiasi altro sistema che si interfacci con
un motore SQL)
Esempio 2
un altro caso di utilizzo è come valutatore di espressioni.
Mi e capitato di vedere gente che applica delle scontistiche assurde
sel genere prezzofinale=listino per numero di scarpe del nonno diviso
2 pgreco quadro.
Per risolvere problemi simili è possibile progettare il codice in
maniera che sia possibile salvarsi la formula in una tabella
direttamente dal cliente (senza quindi dover modificare il programma)
e poi valutarla runtime (anche se in effetti una modifica servirà
perchè spesso ci si dimentica di prevedere  negli archivi la colonna
per il numero di scarpe del nonno. e qui il cliente che non vuole mai
pagare la modifica ti guarda stupito <<Mi chiedo come sia possibile
che in un programma manchi un dato così fondamentale>>).
Esempi 3 e 4 Un po di codice FOXPRO 
Nota le macro sono all'interno delle piccole funzioni
Keylink e toglikeydoppie il resto del codice serve 
per preparare l'esempio
*** PER AVERE UNA FORMATTAZIONE DECENTE COPIARE FINO A FINEBLOCCO 
*** NEL NOTEPAD
* Esempio 3 una funzione che mi ritorna i valori associati ad una
chiave
* di una tabella (ridotto e privato di controlli di errore)
*
* a prima vista, per coloro che non conoscono foxpro l'unica
istruzione enigmatica
* e seek(chiave,tabelle). Questa funzione cerca la chiave dentro una
tabella (spostando
* anche il puntatore al record e ritorna vero se riesce a trovarla
*
* nota: nei confroniti == indicha che due stringhe devono essere
proprio uguali.
* altrimenti il confronto si interrompe alla fine delle seconda
stringa cioè:
* "123"= "12" risulta VERO
* "123"=="12" risulta FALSO
*
*
* Nota: & semplice indica una macro, && doppia un commento
*
* nota: asterisco= commento ad inizio riga  && = commento a mezza
righa
Clear && cancella lo schermo
** PREPARAZIONE DATI PER PROVA
Create cursor tab1(nome c(30),codfis c(16),pariva c(11)) &&crea un
cursore
Index on nome tag indice1
Set order to 1
Insert into tab1 values ("pippo","codfispippo","")
Insert into tab1 values ("pluto","codfispluto","")
Insert into tab1 values ("minni","codfisminni","")
Insert into tab1 values ("topolino","codfistopo","")
Insert into tab1 values ("orazio spa","","
12345678901
")
Create cursor tab2(codart c(10),desart c(30)) &&crea un cursore
Insert into tab2 values ("0003","Cigliegie")
Insert into tab2 values ("0001","Mele")
Insert into tab2 values ("0002","Pere")
Index on codart tag indice1
Set order to 1
? Keylink("Tab1","minni","codfis")     && mi ritorna il codicefiscale
di minni
? Keylink("Tab1","orazio spa","pariva") && mi ritorna il la partita
iva di orazio
? Keylink("Tab2","0002","desart")  && mi ritorna "pere"
Messagebox("premi ok")
* carico una chiave doppia per simulare il problema che voglio
risolvere
* (puo capitare per errori o anche come risultato di elaborazioni)
Insert into tab2 values ("0002","valore errato")
toglikeydoppie()
Browse &&mostra il cursore dove manca il <<valore errato>>
*anzi, è visibile ma marcato come cancellato
Return &&Termina la procedura principale
* nota che la funzione non conosce la forma della tabella in ingresso
Function Keylink(tabella,chiave,target)
	Private oldarea,ritorno
	ritorno="NOT FOUND"
	oldarea=select()
	Select (tabella)
	If seek(chiave,tabella)
		ritorno=&target &&Macro che sostituisce a target il
nome del campo che voglio conoscere
	Endif
	Select (oldarea)
	Return ritorno
	*OK si poteva fare anche senza andare di macro, ma almeno in
fox questa è la strada
	*più semplice
	* Esempio 4 Cancellazione automatica di una chiave doppia
inserita per errore
	* (Toglie la chiave successiva alla prime che è quella
probabilmente con i valori errati)
Function toglikeydoppie()
	chiave=key(1) &&restituisce una stringa contenente l'indice 1
	OldValoreChiave=""
	Scan all
		If OldValoreChiave==&chiave && al posto di chiave è
come se io
			*
dell'indice 1
			Delete
		Endif
		OldValoreChiave=&chiave
	Endscan
	Return
*** 
*** FINEBLOCCO

Esempi 3 e 4 Un po di codice FOXPRO 
ok, potrebbero essere comode, anche se nei codici che hai postato mi
sembra di capire che la cosa è risolvibile anche da delphi, infatti
per quanto riguarda le informazioni sui campi/strutture di tabelle le
puoi leggere a runtime usando TFileds e simili di TTable e TQuery...
Ciao,
Alan Solo

puoi leggere a runtime usando TFileds e simili di TTable e TQuery...
Almeno per l'esempio 3 anche in fox si poteva risolvere in altro modo
senza macro ma il codice da scrivere risulta più lungo e meno
efficiente.
Anche se ho difeso le macro non pensare che io voglia dare avvio 
ad un delphi vs foxpro. Col secondo ci lavoro, ma il primo anche se
io mi ci diletto soltanto sta su un altro pianeta.