TdxSpreadSheet creation and filling via code

Basic usage and formatting

procedure TForm1.b1Click(Sender: TObject);
Var xls:TdxSpreadSheet;
    sh: TdxSpreadSheetTableView;
begin
  xls:=TdxSpreadSheet.Create(Self);
  Try
    xls.BeginUpdate;
    xls.ClearAll;
    sh:=TdxSpreadSheetTableView(xls.AddSheet('Bénéficiaires'));

    // row,col
    if Cells[1,1]=Nil then
      CreateCell(1,1);
    Cells[Row,Col].AsString:='test';
    sh.cells[1,1].Style.Borders[bLeft].Style:=sscbsDouble;
    sh.cells[1,1].Style.Borders[bRight].Color:=clred;
    sh.Cells[1,1].Style.Brush.BackgroundColor:=clcxLightGray;
    sh.Cells[1,1].Style.AlignHorz:=ssahCenter;
    sh.Cells[1,1].Style.DataFormat.FormatCode:='dd/mm/yyyy';
    sh.Cells[1,1].Style.DataFormat.FormatCode:='# ##0.00';
    sh.Cells[1,1].Style.Font.Style:=[fsBold];

    // Formula
    CreateCell(2,1); // B3
    sh.Cells[2,1].SetText('=SUM(B2:B2)',true);

    xls.EndUpdate;
    xls.SaveToFile('C:\Users\gosane\Desktop\text.xlsx');
  Finally
    xls.Free;
  End;
end;

Helpers

function xlscolname(i:integer):string;
var a,b:integer;
begin
  if i<0 then
    result:='?'
  else if i<26 then
    result:=chr(65+i)
  else begin
    a:=i div 26;
    b:=i mod 26;
    result:=chr(64+a)+chr(65+b);
  end;
end;

Working with TPgDAC (DevArt components for Delphi)

TPgLoader

interface uses DALoader,PgLoader;

Type TMyForm = Class(TForm)
       // ...
       private
         procedure PgLoader1PutData(Sender: TDALoader);
     End;

{...}

procedure TFxxx.PgLoader1PutData(Sender: TDALoader);
var i:Integer;
begin
  for i:=1 to 10 do
    Sender.PutColumnData('fieldname',i,Value);
end;


procedure TFxxx.Import;
Var pgl:TPgLoader;
begin
  pgl:=TPgLoader.Create(Application);
  Try
    pgl.Connection:=DM.PgConnection1;
    pgl.TableName:='MyTableName';
    pgl.Options.BufferSize:=65536;
    // pgl.OnProgress:=LoaderProgress;
    pgl.OnPutData:=PgLoader1PutData;
    pgl.CreateColumns;
    // Remove primary key from PgLoader
    for I := 0 to pgl.Columns.Count-1 do
      if pgl.Columns[i].Name='idprimarykey' then begin
        pgl.Columns.Delete(i);
        break;
      end;
    pgl.Load;
  Finally
    pgl.Free;
  End;
end;

KDE5 – Hints and tips

Autostarting applications

Plasma can autostart applications and run scripts on startup and shutdown. To autostart an application, navigate to System Settings > Startup and Shutdown > Autostart and add the program or shell script of your choice. For applications, a .desktop file will be created, for shell scripts, a symlink will be created.

Note:

Programs can be autostarted on login only, whilst shell scripts can also be run on shutdown or even before Plasma itself starts.
Shell scripts will only be run if they are marked executable.

Place Desktop entries (i.e. .desktop files) here:

~/.config/autostart : for starting applications at login.

Place or symlink shell scripts in one of the following directories:

~/.config/plasma-workspace/env : for executing scripts at login before launching Plasma.

~/.config/autostart-scripts : for executing scripts at login.

~/.config/plasma-workspace/shutdown : for executing scripts on shutdown.

Source : https://wiki.archlinux.org/index.php/KDE#Autostarting_applications

SSL, Certificats…

Obtenir des infos

Un résumé utile :

openssl x509 -noout -dates -subject -in moncertif.crt

La totale :

openssl x509 -noout -text -in moncertif.crt

Générer une chaîne pour courier-mta

cat moncert.crt intermediaire.crt moncert.key >/etc/courier/moncert.pem
  • Ne pas oublier de régler les droits à 600 et de donner le fichier à daemon
  • Regarder dans mail.log et pas seulement mail.err
  • Redémarrer courier-mta-ssl

Astuces Delphi

Déclencher une action au démarrage de l’application

procedure TFMain.FormShow(Sender: TObject);
begin
  PostMessage(Button1.Handle,WM_LBUTTONDOWN,0,0);
  PostMessage(Button1.Handle,WM_LBUTTONUP,0,0);
end;

Créer des listes d’objets avec TObjectList

uses Contnrs;

Dans l’interface :

TSQLColumn = Class
  name     : string;
  typ      : string;
  // ...autres champs...
End;
TSqlColumnList = class(TObjectList)
  private
    function GetItem(Index: Integer): TSQLColumn;
    procedure SetItem(Index: Integer; const Value: TSQLColumn);
  public
    property Items[Index: Integer]: TSQLColumn read GetItem write SetItem; default;
end;

Dans l’implémentation :

{ TSqlColumnList }

function TSqlColumnList.GetItem(Index: Integer): TSQLColumn;
begin
  Result:=TSqlColumn(inherited GetItem(Index));
end;

procedure TSqlColumnList.SetItem(Index: Integer; const Value: TSQLColumn);
begin
  inherited setItem(index, value);
end;

Utilisation :

TMyClass = Class
  FColumns        : TSqlColumnList;
  Constructor Create;
  Destructor Destroy; reintroduce;
End;

{ TcatRequete }

constructor TcatRequete.Create;
begin
  FColumns := TSqlColumnList.Create;
end;

destructor TcatRequete.Destroy;
begin
  FColumns.Free;
end;

Et pour remplir la liste :

Var column : TSqlColumn;
begin
  FColumns.Clear;
  // Ajouter un élément
  column:=TSqlColumn.Create;
  FColumns.Add(Column);
  With column do begin
    name := 'xxx';
  end;
end;

Windows 7 – After install

Je passe mon environnement de développement à Windows 7 pour bénéficier des 64bits. Liste de trucs à faire pour nettoyer, accélérer cette chose et la rendre utilisable.

Désactiver la proposition “Windows 10”

  • Windows update
  • Mises à jour installée
  • Rechercher la KB3035583 (voir ici)
  • La désinstaller
  • Rechercher les mises à jour
  • Elle est de nouveau là (dans les facultatives à l’heure où j’écris) : clic droit + Masquer la mise à jour

Désactiver le “défilement régulier”

  • Panneau de configuration
  • Système
  • Paramètres système avancés
  • Performances -> Paramètres
  • Décocher “Animer les contrôles et les éléments à l’intérieur des fenêtres” et “Faire défiler régulièrement la zone de liste”

Autoconnexion d’un utilisateur

  • netplwiz
  • décocher “Les utilisateurs doivent entrer un mot de passe”
  • choisir l’utilisateur à connecter
  • Appliquer
  • Saisir l’éventuel mot de passe

Outils à explorer

Quelques outils qui m’ont l’air excellents mais dont je n’ai pas un besoin immédiat et que je n’ai donc pas pris le temps d’explorer. Mais un jour… 😉

Discourse : un moteur de forum/support technique dynamique (JavaScript), temps réel, avec un brin de StackExchange (modération communautaire). Utilisé par le support SeaFile.

Neo900 : mon prochain téléphone mobile.