Προς το περιεχόμενο

delphi7 και μεγάλο const array


smilefreeware

Προτεινόμενες αναρτήσεις

Επειδή έχω την τρέλα να φτιάχνω προγράμματα αν είναι δυνατόν σε 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 κλπ.

Υπάρχει κάτι καλύτερο που μπορώ να κάνω ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να το βάλεις σαν .res να γίνεται link στο .exe σου. Εφόσον είναι στατικό δεν θα χρειάζεται καν compile παρά μόνο linking.

 

Γράψε λεπτομέρειες για το πώς το χρησιμοποιείς για να σου πω περισσότερα. Π.χ. θες υποχρεωτικά να είναι σε πίνακα; Πώς τα προσπελαύνεις μετά; Θες ταχύτητα, να είναι όλα στη μνήμη ή μπορείς να τα διαβάζεις με μια συνάρτηση που να τα τραβάει από το .exe; Είναι ταξινομημένα; Πόσο συχνά τα αλλάζεις; κτλ κτλ.

 

Μήπως είναι binary δεδομένα και απλά τα μετέτρεψες σε string? Γιατί τότε υπάρχει και πιο εύκολος τρόπος...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα αλφαριθμητικά (στρινγκ) έχουν το ίδιο μήκος;

 

Μια ιδέα μου 'ρθε είναι να ορίσεις κάπως έτσι:

 

>
CONST
 AR: ARRAY [1..277000] OF STRING[color="Red"][b][βάλε το μήκος][/b][/color] = ( ....

 

Και κάτι γενικό: τα "string" δεν έχουν ορισμένο μέγεθος (<255). Δεν είναι π.χ. όπως ένα "longword"=4 μπάιτ. Μπορεί αυτό να προκαλεί το πρόβλημα...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μήπως είναι 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.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα 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. Π.χ. στο πρόγραμμα της υπογραφής μου έχω βάλει ολόκληρο δικτυακό χώρο για να ενσωματώσω τη βοήθεια στο εκτελέσιμο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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 για να μην παιδεύεσαι με κώδικα! :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάτι κατάφερα με συνδυασμό του

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μην το βάζεις σαν string table γιατί τότε θα χρειαστείς διαφορετικό κώδικα και δεν θα βολεύει το TStringList. Βάλ'το σαν ολόκληρο text αρχείο.

 

Δες και τα mail σου... ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό το resourcestring πράγματι είναι λύση, απλώς δεν το ήξερα.

 

Με τράβηξε όμως το res.

Την τρέλλα όμως την ξέρεις, αν δεν το καταφέρω θα σκάσω.

 

Compile το πέτυχα.

Οταν όμως πάταγα κλικ για να τραβήξω από το res

tmpStream := TResourceStream.Create( HInstance, 'keimeno', 'HTML' );

Αυτό το 'keimeno' ότι και αν του έβαζα κτύπαγε.

Δεν μπορώ να βρώ τι όνομα να βάλω.

 

Βρήκα και αυτό http://www.delphidabbler.com/articles.php?article=10

που ενσωματώνει και τρέχει html με res

Στο κάτω μέρος της σελίδας κατεβάζεις demo source.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το 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.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βρέθηκε-βρέθηκε

Thanks.

 

fireworksas5.jpg

 

Το xn resource editor δεν είδα να υποστηρίζει html resources, οπότε (εκτός κι αν έχω χάσει τίποτα νέες εκδόσεις) όσο και να παιδευτείς δεν θα το καταφέρεις!

tmpStream := TResourceStream.Create( HInstance, 'ARXEIO1', 'HTML' )

Δεν είχα πιάσει το 'HTML' τι είναι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Περιμένω την τελική έκδοση με mail, ε; :P ;) :-D

Σύντομα θα έρθει η 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 της φορμας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Υπάρχει το ενσωματωμένο TListView γι' αυτήν την δουλειά, δες π.χ. το πρόγραμμα της υπογραφής μου, αν φτιάξεις έναν πίνακα με ένα δισεκατομμύριο θέσεις τον ζωγραφίζει ακαριαία (virtual) ακόμα και σε 486 @50MHz.

 

Απλά του "δίνεις" τα δεδομένα που θέλεις να ζωγραφίσει στο event Data, και για να μην έχει flicker του ενεργοποιείς και το double buffering.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...