![]() |
|
[مشروع]Carbon File Renamer - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي الأخرى (https://delphi4arab.net/forum/forumdisplay.php?fid=4) +--- قسم : مشاريع دلفي الجماعية (https://delphi4arab.net/forum/forumdisplay.php?fid=24) +--- الموضوع : [مشروع]Carbon File Renamer (/showthread.php?tid=4758) الصفحات:
1
2
|
[مشروع]Carbon File Renamer - S.FATEH - 01-12-2012 بسم الله الرحمان الرحيم السلام عليكم هذا كود سورس لبرنامج بسيط سميته Carbon File Renamer الحقيقة السورس كود غير منظم اطلاقا كنت اود ان اعيد برمجته وفق اسس OOP لكن لضعف حيلتي لم استطع ذلك و لانه ليس لدي لا الوقت و لا الارادة حاليا على الاقل لاتمام البرنامج قررت ان اجعله كمشروع جماعي لمن يريد ان يتم البرنامج وفق OOP كما ان البرنامج يحتوي حاليا على مشاكل حقيقية يمكنني ان اسرد بعضها لمن يريد ان يحل المشاكل بالنسبة لي حاليا لدي الكثير منها .. ليس هناك الكثير من المكونات استخدمت مكون TVirtualTreeView و حزمة MadShi Basic دلفي 2010 هذه الاشياء فقط اللازمة لعمل البرنامج... بالتوفيق و لا تنسونا من صالح دعائكم و اي استفسار انا موجود ... [مشروع]Carbon File Renamer - piratewar - 01-12-2012 هل يمكنك أن ترفق المكونات [مشروع]Carbon File Renamer - SMP3 - 01-12-2012 piratewar كتب :هل يمكنك أن ترفق المكونات كود : http://www.madshi.net/olddlp1.htm
http://www.lischke-online.de/index.php/all-downloads[مشروع]Carbon File Renamer - S.FATEH - 02-12-2012 لمن يريد رأس الخيط يجب اعادة برمجة وحدة FileInfo وفق الـ OOP مثلا اضافة كلاس...File + الوحدة تحتاج الى data structure لفصل البيانات لاني كنت اعمل iterator على vst و ادركت ان هذا خاطئ نحتاج الى فصل البيانات بحثت قليلا وجدت ان هناك دلفي كان يقدم TObjectList لكن النسخ الاحدث تقدم Generics لكن التطبيق يحتاج الى مغوار في ال . OOP يمكنني ان اشرح تفكيري في طريقة عمل البرنامج.... بالتوفيق [مشروع]Carbon File Renamer - SMP3 - 02-12-2012 لماذا استعنت بمكونات خارجية ؟ أعتقد أنه ليس هناك ضرورة لذلك !! تعليق على السورس : السورس جد منظم و قابل للقراءة .. j'aime
[مشروع]Carbon File Renamer - S.FATEH - 04-12-2012 بالنسبة للمكونات استخدمت مكون VirtualTreeView اما السبب في ذلك لانه اسرع مكون في اضافة البيانات موجود على الساحة يمكنك المكون من اضافة 1000000 سجل في اقل من ثانية !! كما ان المكون مرن للغاية فمثلا يوفر لي خاصية اخفاء Column خاصية غير متوفرة في المكون ListView القياسي في حالتي لدي FullPath و FHSize مخفية طبعا احتجت الى FullPath لمنع التكرار في VST صحيح ان المكون سريع و رائع لكن هذا يأتي على حساب التعقيد فيجب ان تفهم طريقة التعامل معه الفكرة الاساسية في المكون انه يعرض البيانات عند الطلب ما لم تكن هناك حاجة لعرضها لن يعرضها كيف ذلك عندما تضيف 100 سجل فانك في الحقيقة لن ترى سوى 10 السجلات الاوائل اما البقية فانت ستحتاج الى Scroll لتراها ما لم تنزل تحت لن تراها اذا لن يعرضها VST اي لن يحملها و عندما تقوم بعمل Scroll فانك بذلك تطلب ان ترى سجلات جديدة و عندها فقط سيقوم VirtualTreeView بتحميل السجلات و عرضها و هذا ما يجعل المكون سريع للغاية في اضافة البيانات... المكون لا يمكنك من اضافة البيانات بطريقة مباشرة و انما تحتاج الى ان تجعلها في Record ثم تقوم بالتأشير على Record و التعامل مع المأشر في حالتي استخدمت Record with methods بنية مقدمة لنسخ دلفي الأحدث ام في حالة اردت استخدام Class فيجب ان تنشأ بعدها Record of class ثم مأشر عليه و تتعامل مع المأشر.. اما MadShi فهي مكتبة تحتوى على دوال نفسها الموجودة في الدلفي فقط اما لديها برامترات اضافية او اسرع من المتواجدة في الدلفي [مشروع]Carbon File Renamer - SMP3 - 04-12-2012 أعلم لقد جربت العمل مع VTV , لكن في مثالك هذا ليس هناك حاجة لاستخدامها , لأن المستخدم لن يضيف 100 ملف دفعة واحدة .. سيقوم باضافة ملف ثم ملف و هكذا .. أما بالنسبة FHSize فليس هناك داعي لاخفائها , يمكنك استعمال المصفوفات Array أو ال Collections , وتقوم بقراءة المصفوفة من خلال ترتيب ال ListView في مثالي الخاص بال Vcl Style , استخدمة مصفوفة OrigName بدل أن أقوم باضافة Column واخفائها و بالنسبة لمكتبة MadShi فأنت لم تستخدم سوى دالتين على ماأعتقد لذلك حاول ألا ترفق الوحدة كاملة [مشروع]Carbon File Renamer - S.FATEH - 06-12-2012 استخدمت FHSize في المقارنة و حسب اي لعمل sort لـ Column الـ Size لا يمكن ان ترتب قيم غير متساوية لذلك استعملت FHSize في ترتيب القيم اي في Size العمود الضاهر لدي قيم مختلفة الوحدة اي يوجد mb و kb و حتى gb اردت ان ابقي على هذه الوحدات لكن في سبيل ترتيب هذه القيم احتاج الى القيم جميعا بنفس الوحدة لذلك استخدمت FHSize حيث اضفت اليها القيم بوحدة kb على ما اعتقد ان شاء الله الفكرة وصلت بالنسبة MadShi معك حق فقط عندما حاولت ان افعل ذلك ظهر ان تلك الدوال تستخدم دوال و ثوابت من وحدات اخرى اعتقد ان ما دام MadShi عبارة عن Package لا ضير في ذلك لانه لن يضيف جميع المكتبات و انما سيتم اضافة فقط الجزء الذي استعملته اذا لن يزيد حجم البرنامج.... [مشروع]Carbon File Renamer - S.FATEH - 04-01-2013 السلام عليكم قمت باعادة برمجة الوحدة FileInfo اضافة TObjectList الخطوة القادمة يجب اعطاء اهمية اكبر لل TObjectList .. [مشروع]Carbon File Renamer - S.FATEH - 04-01-2013 اواجه مشكلة كبيرة في التكرار الموجود في 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. |