smilefreeware Δημοσ. 5 Δεκεμβρίου 2007 Δημοσ. 5 Δεκεμβρίου 2007 Επειδή έχω την τρέλα να φτιάχνω προγράμματα αν είναι δυνατόν σε 1 αρχείο exe μου παρουσιάστηκε το εξής. Εβαλα σε 1 unit CONST AR: ARRAY [1..277000] OF STRING = ( .... περίπου 2.700.000 bytes και 14.000 lines Το compile κόλησε. Το ίδιο το δοκίμασα σε ισχυρότερο μηχάνημα με το CodeGear.RAD.Studio.Delphi.2007 και το κατάφερε αλλά έκανε αρκετή ώρα. Τι είναι αυτό που το πειράζει ? το συνολικό μέγεθος, το μέγεθος του πίνακα, τα strings μήπως τα αλλάξω σε char κλπ. Υπάρχει κάτι καλύτερο που μπορώ να κάνω ?
alkisg Δημοσ. 5 Δεκεμβρίου 2007 Δημοσ. 5 Δεκεμβρίου 2007 Μπορείς να το βάλεις σαν .res να γίνεται link στο .exe σου. Εφόσον είναι στατικό δεν θα χρειάζεται καν compile παρά μόνο linking. Γράψε λεπτομέρειες για το πώς το χρησιμοποιείς για να σου πω περισσότερα. Π.χ. θες υποχρεωτικά να είναι σε πίνακα; Πώς τα προσπελαύνεις μετά; Θες ταχύτητα, να είναι όλα στη μνήμη ή μπορείς να τα διαβάζεις με μια συνάρτηση που να τα τραβάει από το .exe; Είναι ταξινομημένα; Πόσο συχνά τα αλλάζεις; κτλ κτλ. Μήπως είναι binary δεδομένα και απλά τα μετέτρεψες σε string? Γιατί τότε υπάρχει και πιο εύκολος τρόπος...
GCMH Δημοσ. 5 Δεκεμβρίου 2007 Δημοσ. 5 Δεκεμβρίου 2007 Τα αλφαριθμητικά (στρινγκ) έχουν το ίδιο μήκος; Μια ιδέα μου 'ρθε είναι να ορίσεις κάπως έτσι: > CONST AR: ARRAY [1..277000] OF STRING[color="Red"][b][βάλε το μήκος][/b][/color] = ( .... Και κάτι γενικό: τα "string" δεν έχουν ορισμένο μέγεθος (<255). Δεν είναι π.χ. όπως ένα "longword"=4 μπάιτ. Μπορεί αυτό να προκαλεί το πρόβλημα...
smilefreeware Δημοσ. 5 Δεκεμβρίου 2007 Μέλος Δημοσ. 5 Δεκεμβρίου 2007 Μήπως είναι binary δεδομένα και απλά τα μετέτρεψες σε string? Γιατί τότε υπάρχει και πιο εύκολος τρόπος... Οχι είναι extract από μια dbf, απλό κείμενο γράμματα-αριθμοί. Πάντως με πιάνει περιέργεια για το πιό εύκολος τρόπος, γιατί την ίδια τεχνική έχω χρησιμοποιήσει και για binary (CONST AR:ARRAY[0..30003] OF CHAR = (#77,#90,#0,#1,... ) Μπορείς να το βάλεις σαν .res να γίνεται link στο .exe σου. Εφόσον είναι στατικό δεν θα χρειάζεται καν compile παρά μόνο linking. Αυτό δεν το έχω δοκιμάσει. Αν είναι λίγα γράψτα. (Μου δείχνει για λύση) Γράψε λεπτομέρειες για το πώς το χρησιμοποιείς για να σου πω περισσότερα. Π.χ. θες υποχρεωτικά να είναι σε πίνακα; Πώς τα προσπελαύνεις μετά; Θες ταχύτητα, να είναι όλα στη μνήμη ή μπορείς να τα διαβάζεις με μια συνάρτηση που να τα τραβάει από το .exe; Είναι ταξινομημένα; Πόσο συχνά τα αλλάζεις; κτλ κτλ. Μια εμφάνιση τύπου excel θέλω να δώσω με sort κλπ. τίποτα το ιδιαίτερο. Απλώς χρησιμοποιώ δικιά μου ρουτίνα γιατί το TListView είναι αργό για πολλά items. Είναι περίπου 55.000 items με 5 columns. Για ταχύτητα δεν υπάρχει πρόβλημα γιατί έχω χρησιμοποιήσει περισσότερα χωρίς πρόβλημα. Μόνο στο sort θέλει λίγο παιχνίδι. Αυτό με το "συνάρτηση που να τα τραβάει από το .exe" το αποφεύγω μην έχω πρόβλημα με αντιβιοτικά που χτυπάνε κλπ. Παλιά το έκανα, κόλαγα τα data στο τέλος του exe.
alkisg Δημοσ. 5 Δεκεμβρίου 2007 Δημοσ. 5 Δεκεμβρίου 2007 Τα strings τι μέγεθος έχουν; Π.χ. σταθερό 80 χαρακτήρες, μεταβλητό από 1 μέχρι 10.000 χαρακτήρες κτλ. Ρωτάω πολλά γιατί υπάρχουν τεχνικοί περιορισμοί ανάλογα με τη μέθοδο που θα σου προτείνω, υπάρχουν πολλές διαφορετικές. Το linking δεδομένων στο .exe είναι εύκολο, το δύσκολο είναι που τα θες σε array, γι' αυτό και οι ερωτήσεις. Π.χ. το Delphi έχει την resourcestring οδηγία με την οποία ένα string μπαίνει στο .exe. Αν ήθελες απλά πολλά μικρά strings τότε χωρίς εξωτερικά εργαλεία έβαζες όλα τα strings σε ένα unit, το έκανες compile μόνο μία φορά και ξεμπέρδευες. Στην περίπτωσή σου μάλλον αυτό δεν σου κάνει γιατί θες array. Θα μπορούσες να φτιάξεις κι άλλο ένα unit με το array, π.χ. array[1] := myresourcestring1; array[2] := myresourcestring2; κτλ αλλά υπάρχει περιορισμός 4096 bytes για κάθε resourcestring. Μια πολύ καλή εναλλακτική είναι το ανοικτού κώδικα virtual tree view, το οποίο μπορεί να δουλέψει με εκατομμύρια εγγραφές σε ελάχιστο χρόνο. Αντί να χρησιμοποιείς πίνακα χρησιμοποιείς τις ρουτίνες που έχει για streaming και ξεμπερδεύεις. Επίσης τα Windows υποστηρίζουν virtual list boxes (καμία σχέση με το παραπάνω), όπου δεν έχουν δεδομένα, αλλά τα ζητάνε real time από την εφαρμογή όταν θέλουν να τα ζωγραφίσουν στην οθόνη. Έτσι π.χ. μπορείς να έχεις ένα δισεκατομμύριο εγγραφές χωρίς να πιάνουν καθόλου RAM. Για τη συνάρτηση που τραβάει από το .exe εννούσα να μπει κανονικά στο .exe σαν resource, όχι να τα κολλήσεις απλά στο τέλος. Δεν υπάρχει πρόβλημα με τα antivirus σου όταν δουλεύεις με resources. Π.χ. στο πρόγραμμα της υπογραφής μου έχω βάλει ολόκληρο δικτυακό χώρο για να ενσωματώσω τη βοήθεια στο εκτελέσιμο.
smilefreeware Δημοσ. 6 Δεκεμβρίου 2007 Μέλος Δημοσ. 6 Δεκεμβρίου 2007 @alkisg Σου έστειλα mail με λεπτομέρειες. Επακριβώς το αρχείο dbf.
alkisg Δημοσ. 6 Δεκεμβρίου 2007 Δημοσ. 6 Δεκεμβρίου 2007 1) Τα σώζεις σε ένα αρχείο text. Π.χ. με το wordpad. 2) Φτιάχνεις ένα .res αρχείο που στο HTML κομμάτι του (resource-type=23) θα έχει μέσα το .text αρχείο. Αυτό μπορείς να το κάνεις με ένα σωρό utilities, π.χ. reshacker ή με το (δωρεάν) RC.exe από το Platform SDK της Microsoft. 3) Βάζεις ένα {$R arxeio.res} στο main.dpr σου. 4) Στο initialization section ή στο mainformcreate, καλείς τον παρακάτω κώδικα: > procedure LoadStringResource2; var tmpStream: TResourceStream; begin tmpStream := TResourceStream.Create( HInstance, 'keimeno', 'HTML' ); try memo1.Lines.LoadFromStream( tmpStream ); finally tmpStream.Free; end; end; Έτοιμο, στο memo1 έχεις όλο το κείμενο. Φυσικά δεν χρειάζεται να χρησιμοποιήσεις memo, αρκεί ένα οποιοδήποτε TStringList και ας μη φαίνεται στην οθόνη. Compile time = ελάχιστος, χρήση μνήμης = ελάχιστη. Υ.Γ. επίσης δες το DBFPlus ή το DBFNavigator201 για να μην παιδεύεσαι με κώδικα!
smilefreeware Δημοσ. 6 Δεκεμβρίου 2007 Μέλος Δημοσ. 6 Δεκεμβρίου 2007 Κάτι κατάφερα με συνδυασμό του reshacker και του XNResourceEditor http://www.wilsonc.demon.co.uk/d10resourceeditor.htm Πήρα ένα τυχαίο res , το άνοιξα με το XNResourceEditor , έσβησα τα άχρηστα και έκανα add 1 string table και έβαλα 1 string, το έσωσα. Μετά το άνοιξα με το reshacker το οποίο δίνει edit , οπότε πιθανολογώ αν βάλω εκεί το τεχτ με τα strings θα δουλέψει. -------------------------------------------- Από εδώ το βρήκα Free Windows Resource Editors, Resource Compilers, Resource Hackers, Icon Editors http://www.thefreecountry.com/programming/resourceeditors.shtml
alkisg Δημοσ. 6 Δεκεμβρίου 2007 Δημοσ. 6 Δεκεμβρίου 2007 Μην το βάζεις σαν string table γιατί τότε θα χρειαστείς διαφορετικό κώδικα και δεν θα βολεύει το TStringList. Βάλ'το σαν ολόκληρο text αρχείο. Δες και τα mail σου...
smilefreeware Δημοσ. 7 Δεκεμβρίου 2007 Μέλος Δημοσ. 7 Δεκεμβρίου 2007 Αυτό το resourcestring πράγματι είναι λύση, απλώς δεν το ήξερα. Με τράβηξε όμως το res. Την τρέλλα όμως την ξέρεις, αν δεν το καταφέρω θα σκάσω. Compile το πέτυχα. Οταν όμως πάταγα κλικ για να τραβήξω από το res tmpStream := TResourceStream.Create( HInstance, 'keimeno', 'HTML' ); Αυτό το 'keimeno' ότι και αν του έβαζα κτύπαγε. Δεν μπορώ να βρώ τι όνομα να βάλω. Βρήκα και αυτό http://www.delphidabbler.com/articles.php?article=10 που ενσωματώνει και τρέχει html με res Στο κάτω μέρος της σελίδας κατεβάζεις demo source.
alkisg Δημοσ. 7 Δεκεμβρίου 2007 Δημοσ. 7 Δεκεμβρίου 2007 Το xn resource editor δεν είδα να υποστηρίζει html resources, οπότε (εκτός κι αν έχω χάσει τίποτα νέες εκδόσεις) όσο και να παιδευτείς δεν θα το καταφέρεις! Καλύτερα να το κάνεις με το rc.exe από το platform sdk, γίνεται τελείως αυτοματοποιημένα, σαν να κάνεις διπλό κλικ σε batch file. Φτιάχνεις ένα Project.rc με περιεχόμενα σαν αυτό: > LANGUAGE 0, 0 ARXEIO1 HTML "ARXEIO1.TXT" ARXEIO2 HTML "ARXEIO2.TXT" και το καλείς έτσι: > C:\....\PlatformSDK\RC.Exe /v Project.rc Οπότε φτιάχνεται το Project.res, το οποίο είναι αυτό που κάνεις {$R Project.res}. Το 'keimevo' που έλεγες είναι το όνομα του HTML resource που έβαλες μέσα στο Project.rc, στο παραπάνω παράδειγμα δηλαδή το ARXEIO1 και ARXEIO2.
smilefreeware Δημοσ. 8 Δεκεμβρίου 2007 Μέλος Δημοσ. 8 Δεκεμβρίου 2007 Βρέθηκε-βρέθηκε Thanks. Το xn resource editor δεν είδα να υποστηρίζει html resources, οπότε (εκτός κι αν έχω χάσει τίποτα νέες εκδόσεις) όσο και να παιδευτείς δεν θα το καταφέρεις! tmpStream := TResourceStream.Create( HInstance, 'ARXEIO1', 'HTML' ) Δεν είχα πιάσει το 'HTML' τι είναι.
smilefreeware Δημοσ. 9 Δεκεμβρίου 2007 Μέλος Δημοσ. 9 Δεκεμβρίου 2007 Περιμένω την τελική έκδοση με mail, ε; Σύντομα θα έρθει η beta.:-) Τελικά άλλαξα το Memo με TStringList και τα items τα ένωσα ανά 5 ώστε τα 270.000 έγιναν 54.000. Με αυτό τον τρόπο έγινε πολύ γρηγορότερο, σχεδόν ακαριαίο. Στην αρχή με 270.000 και MEMO έκανε 3-4 sec. ΜΙλάω για celeron 1.8 Αντί TListItems έβαλα TStringGrid + TScrollBar. Τα items του TStringGrid είναι όσα εμφανίζονται δηλ. 10-30 και ανάλογα με τη κίνηση του Scroll εμφανίζω τα αντίστοιχα items μέσα στο TStringGrid . Βέβαια θα ελέγξω και το resize της φορμας.
alkisg Δημοσ. 9 Δεκεμβρίου 2007 Δημοσ. 9 Δεκεμβρίου 2007 Υπάρχει το ενσωματωμένο TListView γι' αυτήν την δουλειά, δες π.χ. το πρόγραμμα της υπογραφής μου, αν φτιάξεις έναν πίνακα με ένα δισεκατομμύριο θέσεις τον ζωγραφίζει ακαριαία (virtual) ακόμα και σε 486 @50MHz. Απλά του "δίνεις" τα δεδομένα που θέλεις να ζωγραφίσει στο event Data, και για να μην έχει flicker του ενεργοποιείς και το double buffering.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.