Comme promis à un participant, une dialogbox avec un calendrier et un editbox.
Un bouton ajouter et un trier. La date est mise en début de ligne au
format jj/mm/yyyy + space + texte(maxi 259). Le bouton trier supprime les
lignes dont date < CeJour et range les autres sur ordre croissant. La seule
chose intéressante(je crois) est la fonction qui trie vu que les
enregistrements sont de taille variable. Je sais que le format de fichier
par ligne est mauvais pour la vitesse mais c'est ce qu'on m'avait demandé.
Source / Exemple :
#include <windows.h>
#include <commctrl.h> // et linker avec comctl32.lib
#include "resource.h"
#include "OperTxt.h"
HWND hdat, htxt;
SYSTEMTIME sttm;
char szbuff[260];
char *szappname = "DateTxt";
char *szfrmtDTP = "dd/MM/yyyy";
char *szFlName = "Datage.txt";
char *szERRWRITE = "ERREUR D'ECRITURE";
void InitInstance()
{
SYSTEMTIME stArr[2];
char *c;
SendMessage(hdat, DTM_SETFORMAT, 0, (long) szfrmtDTP);
GetLocalTime(stArr); // hdat, mini CeJour, maxi 31/12/9999
stArr[1].wDay = 31; stArr[1].wMonth = 12; stArr[1].wYear = 9999;
SendMessage(hdat, DTM_SETRANGE, GDTR_MIN | GDTR_MAX, (long) &stArr);
txtSetMinDay(stArr); // pendant qu'on a date du jour
c = szbuff + GetModuleFileName(0, szbuff, 260);
while(*c != '\\') c--; *c = 0;
SetCurrentDirectory(szbuff); // assure txt dans dossier de app, change si tu veux
}
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_INITDIALOG:
SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
hdat = GetDlgItem(hdlg, ID_DATE);
htxt = GetDlgItem(hdlg, IDED_TXT);
SendMessage(htxt, EM_SETLIMITTEXT, 259, 0);
InitInstance();
if(!txtOpenFile(szFlName)) {
strcpy(szbuff, szFlName); strcpy(szbuff + 10, " INDISPONIBLE");
ShowWindow(hdlg, SW_SHOWNORMAL);
MessageBox(hdlg, szbuff, szappname, MB_ICONEXCLAMATION);
EndDialog(hdlg, 0);
}
return 1;
case WM_COMMAND:
switch(wParam) {
case IDBT_ADD: // en fin de fichier
if(!GetWindowText(htxt, szbuff, 260)) {
MessageBeep(0); return 0; // texte obligatoire
}
SendMessage(hdat, DTM_GETSYSTEMTIME, 0, (long) &sttm);
if(txtAddLine(&sttm, szbuff)) SetWindowText(htxt, 0);
else MessageBox(hdlg, szERRWRITE, szappname, MB_ICONEXCLAMATION);
return 0;
case IDBT_TRI:
SetCursor(LoadCursor(0, IDC_WAIT));
txtNormalize(); // je pense mettre un thread + tard
if(txtNormalize() == 0xFFFFFFFF) {
MessageBox(hdlg, "MANQUE MEMOIRE", szappname, MB_ICONEXCLAMATION);
}
SetCursor(LoadCursor(0, IDC_ARROW));
PostMessage(hdlg, WM_NEXTDLGCTL, 0, 0);
return 0;
case IDCANCEL:
txtCloseFile();
EndDialog(hdlg, 0);
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
InitCommonControls();
DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP), NULL, AppDlgProc);
return 0;
}
Conclusion :
OperTxt.cpp contient la gestion sur disque. La seule partie intéressante,
il me semble, est txtNormalize(). On lit tout dans un buffer alloué par
VirtualAlloc() et on procède à un genre d'indexation à posteriori. Ensuite
on trie le tableau d'indexation en ordre croissant sur son champ date et
on remet dans le fichier si >= CeJour.
Bonne lecture.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.