* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Maggio 17, 2024, 04:56:02 pm

Inserisci il nome utente, la password e la durata della sessione.

604 Visitatori, 0 Utenti

Autore Topic: chi mi dà una mano a mettere un po' di ordine al sorgente??  (Letto 4750 volte)

Blue1987

  • Newbie
  • *
  • Post: 27
  • Karma: +0/-0
chi mi dà una mano a mettere un po' di ordine al sorgente??
« il: Aprile 09, 2012, 05:35:38 pm »
ecco qui, ragazzi, dovrei chiedervi un favore...

praticamente, come sapete, sto creando un videogioco molto minimale di calcio-manager...
... ma avendo iniziato da totale analfabeta informatico, pur essendo andato molto avanti nello sviluppo ho pasticciato un bel po' nel sorgente... ed ora mi trovo molto rallentato nello sviluppo!

avrei bisogno che qualcuno un po' più esperto di me in pascal e lazarus mi desse una mano a fare un po' di ordine (il sorgente si può scaricare da qui http://www.calcio4ever.it/ita/pagina_04_01.htm )...

cioé, ci sono molte piccole cose (anche basilari come dichiarare procedure e funzioni globali, dividere il codice in unit differenti, creare oggetti) che non so fare... ed avrei proprio bisogno di qualcuno che mi potesse dedicare anche mezzo pomeriggio per spiegarmi come fare!! (l'ideale credo sarebbe farlo davvero dal vivo, fisicamente in due davanti allo schermo, ma credo che anche in remoto sia fattibile)

se aprite il progetto, capirete cosa intendo quando dico che ho bisogno di una mano a sistemarlo... :)


grazie mille,
Paolo

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3251
  • Karma: +12/-0
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #1 il: Aprile 10, 2012, 09:13:31 am »
Quali sono le dipendenze necessarie?! Ovvero i package aggiuntivi non installate di default?!
Ieri è passato, domani è futuro, oggi è un dono...

Microges2000

  • Global Moderator
  • Full Member
  • *****
  • Post: 130
  • Karma: +1/-0
    • Power of Nature
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #2 il: Aprile 10, 2012, 10:24:02 am »
Innanzi tutto hai inserito veramente troppi componenti con nomi "assurdi" nel senso che Label981 non è un nome che si ricordi no? Stessa cosa per la Form.
Tieni anche presente che è buona norma commentare il codice (dopo 2 mesi non ricordi cosa faceva una procedura) ed accorpare le procedure e funzioni comuni

Comunque tieni presente una cosuccia semplice semplice...
...se devi inserire molti componenti simili tipo

<Immagine 1> <Etichetta 1> <Etichetta 1.1>
<Immagine 2> <Etichetta 2> <Etichetta 2.1>
<Immagine 3> <Etichetta 3> <Etichetta 3.1>
.......
[Eccetera, Eccetera]

come hai inserito per la parte formazione ed energie/voto ti conviene creare i controlli a run time ed inserirli in vettori se le procedure sono molto differenti, oppure lavorare sul campo TAG se le procedure sono simili ma differiscono di alcuni campi, spiego:

Passo 1 creare i controlli (piccolo esempio espandibile)

Codice: [Seleziona]
Var
  Y    : Integer;
  Num  : Integer;
  Img1 : TImage;
  Img2 : TImage;
  Msg  : TLabel
Begin
  Y := 5;  // Posizione iniziale Y primo dato

  // Ciclo per tutte le linee
  For Num := 1 To Numero_Giocatori Do
      Begin
        // Creazione prima immagine
        Img1        := TImage.Create(Self);
        Img1.Parent := Self;

        // Assegnazione coordinate, dimensione ed altre proprietà
        Img1.Left       := 10;
        Img1.Top        := Y;
        Img1.Height     := 16;
        Img1.Width      := 16;
        Img1.Trasparent := True;
        Img1.Visible    := False;

        // Assegnazione immagine
        // ImmagineOriginale1 è un TImage con Visible = False
        // su cui ho caricato l'immagine
        // Oppure se l'immagine è un file su disco uso
        // Img.Image.LoadFromFile(NomeFile);
        Img1.Image.Assign(ImmagineOriginale1);

        // Assegnazione tag di ricerca
        Img1.Tag := I;

        // Creazione seconda immagine
        Img2        := TImage.Create(Self);
        Img2.Parent := Self;

        // Assegnazione coordinate, dimensione ed altre proprietà
        Img2.Left       := Img1.Left+Img1.Width+10;
        Img2.Top        := Y;
        Img2.Height     := 16;
        Img2.Width      := 16;
        Img2.Trasparent := True;
        Img2.Visible    := False;

        // Assegnazione immagine
        // (come per Img1)
        Img2.Image.Assign(ImmagineOriginale2);

        // Assegnazione tag di ricerca
        // (Notare il +$100 serve per la ricerca)
        Img2.Tag := I + $100;

        // Creazione etichetta
        Msg        := TLabel.Create(Self);
        Msg.Parent := Self;

        // Assegnazione coordinate, dimensione ed altre proprietà
        Msg.Left     := Img2.Left + Img2.Width + 50;
        Msg.Top      := Y;
        Msg.Height   := 20;
        Msg.Width    := 140;
        Msg.Autosize := False;
        Msg.Caption  := 'Pippo';

        // Assegnazione eventi
        Msg.OnClick  := Clicca_Giocatore;

        // Assegnazione tag di ricerca
        Msg.Tag := I;

        // Aggiustamento coordinata Y
        Y := Y + 20;
      End;
End;

Passo 2 gestire i controlli

.per gestire i controlli ovviamente devo avere il controllo e, per fare questo, creiamo una procedura che mi ricerchi il controllo che mi serve

Codice: [Seleziona]
// Ritorna l'oggetto TImage con Tag = Quale
// se non trovato ritorna NIL
Procedure TForm1.GetImmagine(Quale : Integer) : TImage;
Var
  I  : Integer;
  Ok : Boolean;
Begin
  // Inizializzazione uscita
  Result := Nil;

  // Ciclo di ricerca
  I  := 1;
  Ok := False;
  While (I <= ControlCount) And (Not Ok) Do
Begin
          // L'oggetto è un TImage?
          If (Controls[I-1] Is TImage) Then
             // L'oggetto ha il TAG uguale a quello passato?
             If (Controls[I-1] As TImage).Tag = Quale Then
                Begin
                  // Memorizzazione controllo
                  Result := (Controls[I-1] As TImage);

                  // Flag di uscita
                  Ok     := True;
                End;

          // Passaggio al successivo         
          Inc(I);
        End;
End;

Stessa cosa se vogliamo ricercare una TLabel invece di un TImage: basta sostituire la dicitura Timage con quella del controllo che vogliamo cercare.

Ora per usare un controllo all'interno del nostro programma possiamo scrivere (esempio sempre con l'immagine)

Codice: [Seleziona]
GetImmagine(2).Visible := True;

oppure

Codice: [Seleziona]
Var
  I : TImage;
Begin
  ....
  I := GetImage(2);
  T.Visible := True;
  ...
End;

la differenza tra il primo metodo ed il secondo è che se vogliamo manipolare più di una proprietà conviene usare la seconda che è più ottimizzata.


Passo 3 gestire gli eventi

Questa è facile... dichiariamo, nella nostra form le procedure di gestione come ad esempio

Codice: [Seleziona]
Procedure Clicca_Giocatore(Sender : TObject)

e la gestiamo nel solito modo fatta eccezzione per le piccole differenze che gestiremo con il campo TAG
Codice: [Seleziona]
Procedure TForm1.Clicca_Giocatore(Sender : TObject);
Var
  Label : TLabel;
Begin
  // Preleviamo l'oggetto chiamante
  Label := (Sender As TLabel);

  // Qui' eseguiamo la gestione comune
  Label.Visible := True;
 
  // Ora eseguiamo la gestione specializzata
  Case Label.Tag Of
       1 : Label.Caption := 'Mario Rossi';
       2 : Label.Caption := 'Luca Bianchi';
  End;
End;
Ciao,
David
Il possibile lo abbiamo già fatto, l'impossibile lo stiamo facendo, per i miracoli ci stiamo attrezzando

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3251
  • Karma: +12/-0
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #3 il: Aprile 10, 2012, 11:17:13 am »
Guardando i sorgenti con il notepad ti posso solo dire: Microges2000 ha già detto tutto!

E' veramente incasinato come codice. Ora capisco il perchè della tua richiesta  :)
Ieri è passato, domani è futuro, oggi è un dono...

Microges2000

  • Global Moderator
  • Full Member
  • *****
  • Post: 130
  • Karma: +1/-0
    • Power of Nature
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #4 il: Aprile 10, 2012, 12:16:49 pm »
Altra piccola cosuccia (non solo in Pascal ma in tutti i linguaggi)

Usa una sola unit per una sola form o oggetto
Raggruppa i tipi, costanti e variabili globali in una unit che chiamerai Costanti_Comuni o Tipi o come ti pare inserendola nella uses delle altre unit che usi
Raggruppa le procedure globali in una sola unit

e, ovviamente, commenta il tutto il più possibile ed in maniera "umana" e dai dei nomi descrittivi alle variabili/funzioni. Per esempio se hai una funzione che esegue una somma tipo:

Codice: [Seleziona]
// Eseguo la somma
Function TForm1.FunctionSum1(A : Integer) : Integer;
Begin
  Result := Round(A+A*1.1+A*1.2);
End;

che ovviamente non si capisce è meglio usare

Codice: [Seleziona]
// Sommo al valore passato il 10% ed il 20%
Function TMainForm.Somma_Percentuali(Valore_Iniziale : Integer) : Integer;
Var
  Risultato : Double;
Begin
  // Prelevo il valore iniziale
  Risultato := Valore_Iniziale;

  // Aggiungo il 10%
  Risultato := Risultato + (Valore_Iniziale * 1.1);

  // Aggiungo il 20%
  Risultato := Risultato + (Valore_Iniziale * 1.2);

  // Prelevo il valore di uscita
  Result := Round(Risultato);
End;

meglio no?
Il possibile lo abbiamo già fatto, l'impossibile lo stiamo facendo, per i miracoli ci stiamo attrezzando

Blue1987

  • Newbie
  • *
  • Post: 27
  • Karma: +0/-0
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #5 il: Aprile 11, 2012, 08:57:43 am »
Raggruppa le procedure globali in una sola unit

ora inizio un po' alla volta a sistemare tutto...
ma... questo ad esempio come si fa?? cioé...
... mi potresti fare un esempio di una unit (intera, dal nome all'end.) che contiene funzioni e procedure globali?
so che sembrerò cretino ma... in che ordine devo mettere le cose?

Microges2000

  • Global Moderator
  • Full Member
  • *****
  • Post: 130
  • Karma: +1/-0
    • Power of Nature
Re:chi mi dà una mano a mettere un po' di ordine al sorgente??
« Risposta #6 il: Aprile 11, 2012, 04:46:27 pm »
Codice: [Seleziona]
Unit Comuni;

Interface

Uses
  Windows, SysUtils;

Procedure Fattoriale(Numero : Integer) : Double;

Procedure WriteLn(Dove : TListBox; Const Stringa : String)

Implementation

Procedure Fattoriale(Numero : Integer) : Double;
Begin
   If Numero > 1 Then Result := Numero*Fattoriale(Numero-1);
End;

Procedure WriteLn(Dove : TListBox; Const Stringa : String)
Begin
   Dove.Lines.Add(Stringa);
End;

end.

Ora se includi la unit Comuni (clausola Uses) puoi utilizzare le due procedure al di sopra della sezione implementation dove vuoi tu

Ciao
Il possibile lo abbiamo già fatto, l'impossibile lo stiamo facendo, per i miracoli ci stiamo attrezzando

 

Recenti

How To

Utenti
  • Utenti in totale: 788
  • Latest: mastro
Stats
  • Post in totale: 18826
  • Topic in totale: 2242
  • Online Today: 708
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 604
Total: 604

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.