[مشروع]Carbon File Renamer
#1
بسم الله الرحمان الرحيم
السلام عليكم هذا كود سورس لبرنامج بسيط سميته Carbon File Renamer
الحقيقة السورس كود غير منظم اطلاقا كنت اود ان اعيد برمجته وفق اسس OOP لكن لضعف حيلتي لم استطع ذلك و لانه ليس لدي لا الوقت و لا الارادة حاليا على الاقل لاتمام البرنامج قررت ان اجعله كمشروع جماعي لمن يريد ان يتم البرنامج وفق OOP كما ان البرنامج يحتوي حاليا على مشاكل حقيقية يمكنني ان اسرد بعضها لمن يريد ان يحل المشاكل بالنسبة لي حاليا لدي الكثير منها ..
ليس هناك الكثير من المكونات استخدمت مكون TVirtualTreeView و حزمة MadShi Basic دلفي 2010 هذه الاشياء فقط اللازمة لعمل البرنامج...
بالتوفيق و لا تنسونا من صالح دعائكم و اي استفسار انا موجود ...


الملفات المرفقة
.rar   FileRenamer.part01.rar (الحجم : 500 ك ب / التحميلات : 194)
.rar   FileRenamer.part02.rar (الحجم : 500 ك ب / التحميلات : 192)
.rar   FileRenamer.part03.rar (الحجم : 260.98 ك ب / التحميلات : 164)
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#2
هل يمكنك أن ترفق المكونات
الرد
#3
piratewar كتب :هل يمكنك أن ترفق المكونات

كود :
http://www.madshi.net/olddlp1.htm http://www.lischke-online.de/index.php/all-downloads
الرد
#4
لمن يريد رأس الخيط
يجب اعادة برمجة وحدة FileInfo وفق الـ OOP
مثلا اضافة كلاس...File
+ الوحدة تحتاج الى data structure لفصل البيانات لاني كنت اعمل iterator على vst و ادركت ان هذا خاطئ نحتاج
الى فصل البيانات بحثت قليلا وجدت ان هناك دلفي كان يقدم TObjectList لكن النسخ الاحدث تقدم Generics لكن التطبيق يحتاج الى مغوار في ال . OOP
يمكنني ان اشرح تفكيري في طريقة عمل البرنامج....

بالتوفيق
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#5
لماذا استعنت بمكونات خارجية ؟
أعتقد أنه ليس هناك ضرورة لذلك !!

تعليق على السورس : السورس جد منظم و قابل للقراءة .. j'aime Smile
الرد
#6
بالنسبة للمكونات استخدمت مكون VirtualTreeView اما السبب في ذلك لانه اسرع مكون في اضافة البيانات موجود على الساحة يمكنك المكون من اضافة 1000000 سجل في اقل من ثانية !! كما ان المكون مرن للغاية فمثلا يوفر لي خاصية اخفاء Column خاصية غير متوفرة في المكون ListView القياسي في حالتي لدي FullPath و FHSize مخفية طبعا احتجت الى FullPath لمنع التكرار في VST صحيح ان المكون سريع و رائع لكن هذا يأتي على حساب التعقيد فيجب ان تفهم طريقة التعامل معه
الفكرة الاساسية في المكون انه يعرض البيانات عند الطلب ما لم تكن هناك حاجة لعرضها لن يعرضها كيف ذلك عندما تضيف 100 سجل فانك في الحقيقة لن ترى سوى 10 السجلات الاوائل اما البقية فانت ستحتاج الى Scroll لتراها ما لم تنزل تحت لن تراها اذا لن يعرضها VST اي لن يحملها و عندما تقوم بعمل Scroll فانك بذلك تطلب ان ترى سجلات جديدة و عندها فقط سيقوم VirtualTreeView بتحميل السجلات و عرضها و هذا ما يجعل المكون سريع للغاية في اضافة البيانات...
المكون لا يمكنك من اضافة البيانات بطريقة مباشرة و انما تحتاج الى ان تجعلها في Record ثم تقوم بالتأشير على Record و التعامل مع المأشر في حالتي استخدمت Record with methods بنية مقدمة لنسخ دلفي الأحدث ام في حالة اردت استخدام Class فيجب ان تنشأ بعدها Record of class ثم مأشر عليه و تتعامل مع المأشر..
اما MadShi فهي مكتبة تحتوى على دوال نفسها الموجودة في الدلفي فقط اما لديها برامترات اضافية او اسرع من المتواجدة في الدلفي
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#7
أعلم لقد جربت العمل مع VTV , لكن في مثالك هذا ليس هناك حاجة لاستخدامها , لأن المستخدم لن يضيف 100 ملف دفعة واحدة .. سيقوم باضافة ملف ثم ملف و هكذا ..
أما بالنسبة FHSize فليس هناك داعي لاخفائها , يمكنك استعمال المصفوفات Array أو ال Collections , وتقوم بقراءة المصفوفة من خلال ترتيب ال ListView

في مثالي الخاص بال Vcl Style , استخدمة مصفوفة OrigName بدل أن أقوم باضافة Column واخفائها
و بالنسبة لمكتبة MadShi فأنت لم تستخدم سوى دالتين على ماأعتقد لذلك حاول ألا ترفق الوحدة كاملة
الرد
#8
استخدمت FHSize في المقارنة و حسب اي لعمل sort لـ Column الـ Size لا يمكن ان ترتب قيم غير متساوية لذلك استعملت FHSize في ترتيب القيم اي في Size العمود الضاهر لدي قيم مختلفة الوحدة اي يوجد mb و kb و حتى gb اردت ان ابقي على هذه الوحدات لكن في سبيل ترتيب هذه القيم احتاج الى القيم جميعا بنفس الوحدة لذلك استخدمت FHSize
حيث اضفت اليها القيم بوحدة kb على ما اعتقد ان شاء الله الفكرة وصلت
بالنسبة MadShi معك حق فقط عندما حاولت ان افعل ذلك ظهر ان تلك الدوال تستخدم دوال و ثوابت من وحدات اخرى
اعتقد ان ما دام MadShi عبارة عن Package لا ضير في ذلك لانه لن يضيف جميع المكتبات و انما سيتم اضافة فقط الجزء الذي استعملته اذا لن يزيد حجم البرنامج....
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#9
السلام عليكم قمت باعادة برمجة الوحدة FileInfo اضافة TObjectList
الخطوة القادمة يجب اعطاء اهمية اكبر لل TObjectList ..


الملفات المرفقة
.rar   FileRenamer.rar (الحجم : 214.26 ك ب / التحميلات : 57)
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#10
اواجه مشكلة كبيرة في التكرار الموجود في ImageList لمن يريد ان يجرب حل المشكل
PHP كود :
http://pastebin.com/pjeWq2uN 
كود :
unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, StdCtrls, VirtualTrees, Contnrs; type TForm3 = class(TForm) VirtualStringTree1: TVirtualStringTree; Button1: TButton; ImageList1: TImageList; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); private { Private declarations } public { Public declarations } end; TFile = class(TObject) private FFullPath: string; FFileName: string; FIconIndex: Integer; FFileIcon : hIcon; public constructor Create(Path: string); property FullPath: string read FFullPath write FFullPath; property FileName: string read FFileName write FFileName; property IconIndex: Integer read FIconIndex write FIconIndex; property FileIcon: hIcon read FFileIcon write FFileIcon; end; TFiles = class(TObjectList) private function SameIcon(HIcon1, HIcon2: HIcon): Boolean; function StreamsAreIdentical(Stream1, Stream2: TStream): Boolean; public function Add(Path: string): TFile; reintroduce; end; PFileNode =^TFileNode; TFileNode = record FileObj: TFile; end; var Form3: TForm3; Files: TFiles; implementation uses ShellApi, CommCtrl; {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); var i: Integer; OpenDialog: TOpenDialog; FileRec: PFileNode; begin OpenDialog := TOpenDialog.Create(Self); OpenDialog.Options := [ofAllowMultiSelect]; if not(OpenDialog.Execute) then Exit; for I := 0 to OpenDialog.Files.Count - 1 do begin FileRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(nil)); FileRec.FileObj := Files.Add(OpenDialog.Files[i]); end; end; { TFile } constructor TFile.Create(Path: string); var FileInfo: SHFILEINFO; begin FullPath := Path; SHGetFileInfo(PChar(FullPath), FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_DISPLAYNAME or SHGFI_TYPENAME or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or SHGFI_SMALLICON); FileName := ExtractFileName(FullPath); FileIcon := FileInfo.hIcon; end; { TFiles } function TFiles.Add(Path: string): TFile; var i: Integer; TmpFile: TFile; begin TmpFile := TFile.Create(Path); TmpFile.IconIndex := ImageList_AddIcon(Form3.ImageList1.Handle, TmpFile.FileIcon); Result := TmpFile; inherited Add(Result); //here where i want to check for duplicates { for I := 0 to Count - 1 do begin if SameIcon(TmpFile.FileIcon, TFile(Items[i]).FileIcon) then TmpFile.IconIndex := TFile(Items[i]).IconIndex else // if the icon found in Items[i] don't add the icon to imagelsist // dont add new icon to imagelist just get the iconindex of the existing icon TmpFile.IconIndex := ImageList_AddIcon(Form3.ImageList1.Handle, TmpFile.FileIcon); //else add the new icon Result := TmpFile; inherited Add(Result); end;} end; function TFiles.SameIcon(HIcon1, HIcon2: HIcon): Boolean; var Icon1, Icon2: TIcon; MS1, MS2: TMemoryStream; begin Icon1 := TIcon.Create; Icon1.Handle := HIcon1; Icon2 := TIcon.Create; Icon2.Handle := HIcon2; MS1 := TMemoryStream.Create; MS2 := TMemoryStream.Create; try Icon1.SaveToStream(MS1); Icon2.SaveToStream(MS2); Result := StreamsAreIdentical(MS1, MS2); finally MS1.Free; MS2.Free; Icon1.Free; Icon2.Free; end; end; function TFiles.StreamsAreIdentical(Stream1, Stream2: TStream): Boolean; const Block_Size = 4096; var Buffer_1: array[0..Block_Size-1] of byte; Buffer_2: array[0..Block_Size-1] of byte; Buffer_Length: integer; begin Result := False; if Stream1.Size <> Stream2.Size then exit; Stream1.Position := 0; Stream2.Position := 0; while Stream1.Position < Stream1.Size do begin Buffer_Length := Stream1.Read(Buffer_1, Block_Size); Stream2.Read(Buffer_2, Block_Size); if not CompareMem(@Buffer_1, @Buffer_2, Buffer_Length) then exit; end; Result := True; end; procedure TForm3.FormCreate(Sender: TObject); begin Files := TFiles.Create; end; procedure TForm3.FormDestroy(Sender: TObject); begin Files.Free; end; procedure TForm3.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); var FileRec: PFileNode; begin FileRec := Sender.GetNodeData(Node); if Kind in [ikNormal , ikSelected] then begin if Column = 1 then ImageIndex := FileRec.FileObj.IconIndex; end; end; procedure TForm3.VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TFileNode); end; procedure TForm3.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var FileRec: PFileNode; begin FileRec := Sender.GetNodeData(Node); case Column of 0: CellText := FileRec.FileObj.FullPath; 1: CellText := FileRec.FileObj.FileName; end; end; end.
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم