Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 12:46

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Anime & Manga Datenbank
BeitragVerfasst: Do Jul 07, 2005 10:38 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

hab mal wieder ein proggie gebaut welches einige der alltäglichen modern-otaku problemchen löst:

- Hmm, in welchem regal steht das :p
- Auf welcher dvd hatte ich das denn :p
- Hab ich das schon gesehen :p
- Hat die DVD deutsche oder englishe subs gehabt :p
- War das ne OVA oder ne TV :p
- Ich bin verwirrt, ich find gar nix mehr :p

Als lösung des ganzen:

Eine Datenbank welchen man den gesamten Inhalt seiner Sammlung eingeben kann, egal ob CD/DVD/VHS/HDD/Manga usw.
Schön übersichtlich und gut Strukturiert wie man hier auf den Screenshots sehen kann:

Bild

Damit man bei Animes nicht soviel eintragen muss, kann man die namen direkt über den AnimeNFO Server suchen und die felder automatisch füllen lassen:

Bild

Über die Hauptliste kann man die Nötigen infos gleich sehen, den Typ (OVA, TV, Movie, Special, Manga usw.) und kann auch direkt über Filter direkt suchen.

Das Standard Speicherformat ist ein einfaches ASCII Trennzeichen format welches pro spalte durch das 256te ASCII zeichen getrennt wird.
Um Versionskonflikte zu vermeiden hab ich der ASCII datei auch noch als Kopf-Information eine Versionsinfo mitgegeben.

Genannt hab ich das ganze "kawaii database system" und hat sogar vollständigen Unicode support.
Sprich eingabe/ausgabe von Japanischen Zeichen ist möglich wie man sieht:

Bild

Für die nicht-Anime/mangafans hier:

Das Programm ist allgemein gehalten und bis auf die Suche via AnimeNFO kann man es auch für normale Filme oder bücher nehmen :)
Für musik theoretisch auch, allerdings machen dann einige Felder nicht viel sinn :p

Nun zum technischen:

Das ganze ist ne simple SDI Anwendung welche als Liste die "TMS Software" HTML TreeList komponente benutzt da ich da nix besseres gefunden hatte und selber machen momentan von meinem zeittechnischen möglichkeiten zu aufwendig wäre.

Da diese Komponente nur AnsiStrings supported hab ich das ASCII Charset von diesem auf Japanisch umgestellt und über einen kleinen trick welchen ich in http://www.delphi3000.com gefunden habe, den Unicode String (WideString) nach AnsiString konvertiert mit dem dazugehörigem Charset. Da die Liste nicht direkt ändernbar ist, hat das alles wunderbar gepasst.

Da es auch kein ReadLn und WriteLn für Unicode Dateien gibt hab ich mir diese dazugebaut.

Hier sind die routinen für Interessierte:
Code:
  1.  
  2. unit unilib;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows;
  8.  
  9. const
  10.   IID_MLangConvertCharset: TGUID = '{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}';
  11.   CLASS_MLangConvertCharset :TGUID = '{D66D6F99-CDAA-11D0-B822-00C04FC9B31F}';
  12.  
  13. type
  14.   tagMLCONVCHARF = DWORD;
  15.  
  16. const
  17.   MLCONVCHARF_AUTODETECT: tagMLCONVCHARF = 1;
  18.   MLCONVCHARF_ENTITIZE  : tagMLCONVCHARF = 2;
  19.  
  20. type
  21.   tagCODEPAGE = UINT;
  22.  
  23. const
  24.   CODEPAGE_Thai                  : tagCODEPAGE = 0874;
  25.   CODEPAGE_Japanese              : tagCODEPAGE = 0932;
  26.   CODEPAGE_Chinese_PRC           : tagCODEPAGE = 0936;
  27.   CODEPAGE_Korean                : tagCODEPAGE = 0949;
  28.   CODEPAGE_Chinese_Taiwan        : tagCODEPAGE = 0950;
  29.   CODEPAGE_UniCode               : tagCODEPAGE = 1200;
  30.   CODEPAGE_Windows_31_EastEurope : tagCODEPAGE = 1250;
  31.   CODEPAGE_Windows_31_Cyrillic   : tagCODEPAGE = 1251;
  32.   CODEPAGE_Windows_31_Latin1     : tagCODEPAGE = 1252;
  33.   CODEPAGE_Windows_31_Greek      : tagCODEPAGE = 1253;
  34.   CODEPAGE_Windows_31_Turkish    : tagCODEPAGE = 1254;
  35.   CODEPAGE_Hebrew                : tagCODEPAGE = 1255;
  36.   CODEPAGE_Arabic                : tagCODEPAGE = 1256;
  37.   CODEPAGE_Baltic                : tagCODEPAGE = 1257;
  38.  
  39. type
  40.   IMLangConvertCharset = interface
  41.     ['{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}']
  42.     function Initialize(
  43.       uiSrcCodePage: tagCODEPAGE; uiDstCodePage: tagCODEPAGE;
  44.       dwProperty: tagMLCONVCHARF
  45.     ): HResult; stdcall;
  46.     function GetSourceCodePage(
  47.       out puiSrcCodePage: tagCODEPAGE
  48.     ): HResult; stdcall;
  49.     function GetDestinationCodePage(
  50.       out puiDstCodePage: tagCODEPAGE
  51.     ): HResult; stdcall;
  52.     function GetProperty(out pdwProperty: tagMLCONVCHARF): HResult; stdcall;
  53.     function DoConversion(
  54.       pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT
  55.     ): HResult; stdcall;
  56.     function DoConversionToUnicode(
  57.       pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PWChar; pcDstSize: PUINT
  58.     ): HResult; stdcall;
  59.     function DoConversionFromUnicode(
  60.       pSrcStr: PWChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT
  61.     ): HResult; stdcall;
  62.   end;
  63.  
  64.   CoMLangConvertCharset = class
  65.     class function Create: IMLangConvertCharset;
  66.     class function CreateRemote(const MachineName: string): IMLangConvertCharset;
  67.   end;
  68.  
  69. function TransferUnicodeToCodePage(ToCP:tagCODEPAGE;SText:WideString):String;
  70. function TransferCodePageToUnicode(FromCP:tagCODEPAGE;QText:String):WideString;
  71.  
  72. procedure WriteLnW(var _F : File; const _S : WideString);
  73. procedure ReadLnW(var _F : File; var _S : WideString);
  74.  
  75. implementation
  76.  
  77. uses
  78.   ComObj;
  79.  
  80. // CoMLangConvertCharset
  81. // *****************************************************************************
  82.  
  83. class function CoMLangConvertCharset.Create: IMLangConvertCharset;
  84. begin
  85.   Result := CreateComObject(CLASS_MLangConvertCharset) as IMLangConvertCharset;
  86. end;
  87.  
  88. class function CoMLangConvertCharset.CreateRemote(
  89.   const MachineName: string): IMLangConvertCharset;
  90. begin
  91.   Result := CreateRemoteComObject(
  92.     MachineName, CLASS_MLangConvertCharset) as IMLangConvertCharset;
  93. end;
  94.  
  95. // Unicode Routines
  96. // *****************************************************************************
  97.  
  98. function TransferUnicodeToCodePage(ToCP:tagCODEPAGE;SText:WideString):String;
  99. var
  100.   Conv: IMLangConvertCharset;
  101.   Source: PWChar;
  102.   Dest: PChar;
  103.   SourceSize, DestSize: UINT;
  104. begin
  105.   Conv := CoMLangConvertCharset.Create;
  106.   Conv.Initialize(CODEPAGE_UniCode,ToCP, MLCONVCHARF_ENTITIZE);
  107.   Source := PWChar(SText);
  108.   SourceSize := Succ(Length(SText));
  109.   DestSize := 0;
  110.   Conv.DoConversionFromUnicode(Source, @SourceSize, nil, @DestSize);
  111.   Getmem(Dest, DestSize);
  112.   try
  113.     Conv.DoConversionFromUnicode(Source, @SourceSize, Dest, @DestSize);
  114.     result:= Dest;
  115.   finally
  116.     FreeMem(Dest);
  117.   end;
  118. end;
  119.  
  120. function TransferCodePageToUnicode(FromCP:tagCODEPAGE;QText:String):WideString;
  121. var
  122.   Conv: IMLangConvertCharset;
  123.   Dest: WideString;
  124.   SourceSize, DestSize: UINT;
  125. begin
  126.   Conv:= CoMLangConvertCharset.Create;
  127.   Conv.Initialize(FromCP, CODEPAGE_UniCode, MLCONVCHARF_ENTITIZE);
  128.   SourceSize := length(QText);
  129.   DestSize := 0;
  130.   Conv.DoConversionToUnicode(PChar(QText),@SourceSize,nil,@DestSize);
  131.   SetLength(Dest,DestSize);
  132.   try
  133.     Conv.DoConversionToUnicode(PChar(QText),@SourceSize,PWChar(Dest),@DestSize);
  134.   finally
  135.     result:=Dest;
  136.     Finalize(Dest);
  137.   end;
  138. end;
  139.  
  140. procedure WriteLnW(var _F : File; const _S : WideString);
  141. var
  142.   C : WideChar;
  143. begin
  144.   BlockWrite(_F, _S[1], Length(_S)*SizeOf(WideChar));
  145.  
  146.   C := WideChar(#13);
  147.   BlockWrite(_F, C, SizeOf(WideChar));
  148.  
  149.   C := WideChar(#10);
  150.   BlockWrite(_F, C, SizeOf(WideChar));
  151. end;
  152.  
  153. procedure ReadLnW(var _F : File; var _S : WideString);
  154. var
  155.   C      : WideChar;
  156.   CRLF   : Boolean;
  157.   Buffer : WideString;
  158. begin
  159.   CRLF := False;
  160.   Buffer := '';
  161.   while (not EOF(_F)) and (not CRLF) do
  162.   begin
  163.     BlockRead(_F, C, SizeOf(WideChar));
  164.  
  165.     if (C = #13) then
  166.     begin
  167.       if (not EOF(_F)) then
  168.       begin
  169.         BlockRead(_F, C, SizeOf(WideChar));
  170.         if (C = #10) then
  171.           CRLF := True;
  172.       end;
  173.     end
  174.     else
  175.       Buffer := Buffer + C;
  176.   end;
  177.   _S := Buffer;
  178. end;
  179.  


Das Interne format welches die Daten im Speicher hält ist auch sehr simple, ein record mit den jeweiligen daten als WideString, ein Zeiger drauf und fertig.

Da ich nen Offline Dateiformat haben wollte, hab ich als Format nen Unicode Textformat gewählt welches so aufgebaut ist:

[Trennzeichen] = das 256 ASCII zeichen welches so aussieht: "ÿ"
[Trennzeichen für Special CRLF] = das 255 ASCII zeichen welches so aussieht: "þ"

Code:
  1.  
  2. kawaii database[Trennzeichen]Versionsnummer[Trennzeichen]Anzahl einträge[Trennzeichen]
  3.  


und dann für jeden eintrag:

Code:
  1.  
  2. Spalte1[Trennzeichen]Spalte2[Trennzeichen]Spalte3[Trennzeichen]... usw.
  3.  


Das [Trennzeichen für Special CRLF] ist dafür da, das #13#10 (also zeilenumbruch) in allen felder durch dieses trennzeichen ersetzt wird und später beim laden wieder zurück in ursprungszustand also #13#10 ersetzt wird.
Somit passiert niemals das nen Zeilenumbruch drin ist der nicht gewollt ist.
Beim Memo Feld Kommentar definitiv sinnvoll.



Da ich den Wurst über Versionkonflikte nicht gehen wollte hab ich abfang routinen drin, welches jede alte versionen trotzdem noch korrekt lädt und er erst beim speichern wirds dann zur aktuellen version konvertiert.

Natürlich hätte ich das ganze auch mit XML machen können, allerdings bräuchte ich da nen Unicode XML Parser und meiner an dem ich baue habe ist noch nicht soweit und wie gesagt: Die zeit ist mein feind :(
Noch dazu gibt es keinen gescheiten Unicode XML Parser für Delphi :(



Da man auch seine Datenbank auch anderstweilig nutzen kann hab ich dem eine Export-Pluginschnittstelle spendiert welche sehr einfach angesteuert wird, damit ist die erweiterbarkeit in der Form gesichert und man muss nicht alles direkt ins Programm mit reinschleppen.

Jedes Export Plugin hat bisher 5 Methoden:

Code:
  1.  
  2. // Output the Library name
  3. function GetName : PChar; stdcall;
  4. // Output the Extension, example: ".txt"
  5. function GetExtension : PChar; stdcall;
  6. // Start Export from mainapp, filename is the output filename choosen in the main app
  7. procedure BeginExport(Filename : PChar); stdcall;
  8. // One Entry Export from the main app, entry is a data pointer to the KawaiiEntry structure.
  9. procedure OneEntryExport(Entry : Pointer); stdcall;
  10. // End Export from mainapp
  11. procedure EndExport; stdcall;
  12.  


Die Filterung (Suche) von der Hauptapplikation ist mit der der Exportplugins verknüpft, somit kann man auch nur bestimmte sachen exportieren lassen und benötigt auch kein extra fenster für das.



Zukunfspläne:

- Open/Save Plugins welche es möglich macht direkt MySQL oder sonstige Datenbanken zu laden/speichern.
Man kann also dann das Speicherformat wählen und ist nicht gebunden auf das Standard format.

- Eine 6 Methode für Export plugins, damit man nen eigenes Konfigurationsfenster einblenden kann vor dem Hauptfenster um einstellung Plugin-Spezifisch machen zu können.

- Portierung nach FreePascal für Platform unabhängigkeit.

Download:

Aktuelleste Binary http://xenorate.com/final/kawaii_database_system/kawaii_current.zip



Hoffe mal euch gefällt das tool und ein oder zwei können was mit anfangen, wer vorschläge oder tips usw hat kann gerne in den "Projekt Meinungen" posten :)

Thx,
Final


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Foren-Übersicht » Sonstiges » Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 31 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.067s | 17 Queries | GZIP : On ]