Schrift
[thread]5278[/thread]

Suche: Tabelle mit DragDrop-Funktionalität (Seite 2)



<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
GoodFella
 2007-01-12 11:04
#46088 #46088
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
So, schluss mit Editieren.
Ich habe tief gegraben, möchte die beiden scrollbars von Tk::Table per get auslesen. Leider gibt es innerhalb Tk::Table kein einziges Advertised Widget, kann also ->Subwidget("..") vergessen, bleibt noch ->children(".."), wo ich allerdings auch nicht richtig weiterkomme. Um mir das ganze zu veranschaulichen, hab ich mir per Install-Marathon Tk::WidgetDump zugelegt (einfach per ppm-gui scheint heute nix zu gehen ^^).. half mir aber auch nicht weiter.
Jemand eine Idee, wie ich auf das Tk::ScrollBar-Widget von Tk::Table zugreifen kann?

(Hab mir überlegt, die Tabelle seriell zu splitten und gewisse Zeilen per MatchScan zu eleminieren, dann wäre die Reaktionszeit kein Problem mehr -> weswegen ich jetzt auf den DragnDrop Workaround per manueller Offset-Ermittlung setze. TableMatrix war ja aufgrund fehlendem DnD eh keine Option)
ptk
 2007-01-12 21:23
#46089 #46089
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Anscheinend werden die beiden Scrollbars in $tktable->{xsb} und $tktable->{ysb} geschrieben. Das ist natürlich nicht öffentlich. Es wäre wahrscheinlich besser, wenn man Subwidgets wie bei Scrolled() hat, am besten mit gleichen Namen.

Tk::TableMatrix: eventuell geht es doch mit DnD. Du musst dann die gesamte TableMatrix als DropSite definieren und dann beim Droppen feststellen, welche Position der Mauscursor hat (z.B. mit pointerxy) und daraus die Zelle in der TableMatrix ausrechnen. Ich kann mir vorstellen, dass es dazu eine Methode gibt.

Dass TableMatrix bei dir wegen eines fehlenden string.h nicht compiliert, ist mehr als merkwürdig. Diese Include-Datei ist bei C Pflicht! Vielleicht liegt es daran, dass #include "string.h" statt #include <string.h> verwendet wurde? Oder anders herum?
GoodFella
 2007-01-12 21:55
#46090 #46090
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Ja, ich kann auch nicht darauf zugreifen, $table->{xsb}->get() funktioniert nicht.

Zeile 20 von tkTable.h lautet:
#include <string.h>

Hast du TableMatrix bei dir installiert bekommen?

..TableMatrix mit DnD zu nutzen wär natürlich genau das richtige..werde mich jetzt erstmal totgoogeln.

[update>>]
Hab das hier gefunden: http://www.mico.org/pipermail/mico-devel/2006-May/009675.html
und daraufhin nach string.h auf der platte gesucht und den gefundenen Pfad per set include=...;%include% hinzugefügt; jetzt hat er string.h gefunden, ABER
--> cannot open input file 'oldnames.lib' <-- .. war ja klar. Dasselbe Spiel mit oldnames.lib wiederholt, funktioniert nicht.
Kann mir eventuell jemand einen funktionierenden C-Compiler (am besten ein standalone ohne installation) für winxp zukommen lassen, der mit make zusammenarbeitet?\n\n

<!--EDIT|GoodFella|1168632884-->
ptk
 2007-01-12 23:04
#46091 #46091
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich benutze kein Windows, deshalb habe ich keine Probleme mit TableMatrix.

Guck mal bei http://cpan.uwinnipeg.ca/module/Tk::TableMatrix nach, da gibt es noch ein weiteres Repository mit einem PPM für Tk::TableMatrix.

EDIT: Link korrigiert\n\n

<!--EDIT|ptk|1168641444-->
GoodFella
 2007-01-13 00:07
#46092 #46092
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,12.01.2007, 22:04]Ich benutze kein Windows, deshalb habe ich keine Probleme mit TableMatrix.

Guck mal bei http://cpan.uwinnipeg.ca/module/Tk::TableMatrix nach, da gibt es noch ein weiteres Repository mit einem PPM für Tk::TableMatrix.[/quote]
YEA!!!!!!!!
Code: (dl )
ppm3 install http://www.bribes.org/perl/ppm/Tk-TableMatrix.ppd

Ein Einzeiler bringt den Erfolg!!! .. und ich brech mir hier einen ab mit compilen etc.. na mal sehen, inwieweit ich DnD darauf applizieren kann. Melde mich dann nochmal.

Allerdings sehe ich dem trotzdem nicht so optimistisch entgegen, wenns also eine Möglichkeit gäbe, die Scrollbar-Postion von Tk::Table auszulesen, wäre ich sehr dankbar für ein bischen Code diesbetreffend.

Man soll sich ja mehrere Türen offen halten ;)\n\n

<!--EDIT|GoodFella|1168639704-->
GoodFella
 2007-01-13 05:17
#46093 #46093
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
soo, ich habe jetzt ein Beispielscript geschrieben, was ungefähr macht, was ich will.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/local/bin/perl -w

use Tk;
use Tk::TableMatrix;
require Tk::JBrowseEntry;
require Tk::DragDrop;
require Tk::DropSite;
use Tk::Font;

use strict;

my $top = MainWindow->new;
my $tm_array = {};

foreach my $row  (-1..6)
{
 foreach my $col (-2..5)
  {
   $tm_array->{"$row,$col"} = "$row:$col";
  }
}

sub row_sub
{
 my $row = shift;
 return "OddRow" if( $row > 0 && $row % 2)
}

sub get_cell_coords
{
 my $t = shift;
 my $table_x_offset = 50; # wegen linkem scrollbar, der ist 50px breit
 my $table_y_offset = 0;
 my $font = $t->cget(-font);
 my ($x, $y, $pixel_x, $pixel_y) = (0, 0, 0, 0);

 # Tabellenbreite in Pixel bestimmen:
 for ($x=(-$t->cget('-titlecols')); $x<=($t->cget('-cols')); $x++)
  {
   $pixel_x += $font->measure("X" x ($t->colWidth($x))) + 1; # + 1 wegen 1px Rahmen
  }

 my $t_width = $pixel_x;                                                                     # Tabellenbreite
 my $t_height = ($font->actual('-size') + 1) * ($t->cget('-rows') + $t->cget('-titlerows')); # Tabellenhöhe
 my $x_offset = int(($t->xview)[0] * $t_width);  # Scroll-Offset X
 my $y_offset = int(($t->yview)[0] * $t_height); # Scroll-Offset Y
 my ($mouse_x, $mouse_y) = $t->pointerxy;   # Mausposition
 my $real_mouse_x = $mouse_x + $x_offset;   # echte Mausposition X (nach Scrollen)
 my $real_mouse_y = $mouse_y + $y_offset;   # echte Mausposition Y (nach Scrollen)
 my ($x_units, $y_units) = (0, 0);                             # Returnwert-Startwerte
 ($pixel_x, $pixel_y) = ($table_x_offset, $table_y_offset);    # Startwerte fürs iterieren, zwischen welchen Units die Mausposition liegt

 # X-Units bestimmen:
 for ($x=(-$t->cget('-titlecols')); $x<=($t->cget('-cols')); $x++)
  {
   my $current_col_width = $font->measure("x" x ($t->colWidth($x))) + 1; # + 1 wegen 1px Rahmen
   last if (($pixel_x + $current_col_width) > $real_mouse_x); # Wenn die nächste Iteration ausserhalb liegt, ist dies die richtige Zelle
   $pixel_x += $current_col_width;
   $x_units++;
  }

 # Y-Units bestimmen:
 for ($y=(-$t->cget('-titlerows')); $y<=($t->cget('-rows')); $y++)
  {
   my $current_row_height = ($font->actual('-size') + 1) * $y; # + 1 wegen 1px Rahmen
   last if (($pixel_y + $current_row_height) > $real_mouse_y); # Wenn die nächste Iteration ausserhalb liegt, ist dies die richtige Zelle
   $pixel_y += $current_row_height;
   $y_units++;
  }

 return("$x_units:$y_units");
}

my $label = $top->Label(-text => "Headline");

my $t = $top->Scrolled( 'TableMatrix', -rows => 8, -cols => 8,
                       -width => 6, -height => 6,
                       -titlerows => 3, -titlecols => 2,
                       -variable => $tm_array,
                       -roworigin =>  -1,  -colorigin  => -2,
                       -rowtagcommand => \&row_sub,
                       -colstretchmode => 'last',
                       -rowstretchmode => 'last',
                       -selectmode => 'extended',
                       -sparsearray => 0 );

my $cb_use = $t->Checkbutton( -text => 'nutzen' );
my @test_arr = ( 'TEXT', 'ZAHL', '#.## ¤', '#.## ¤ / # ¤', 'PLZ', 'TT.MM.JJJJ', 'TT.MM.JJ' );
my $test_var = $test_arr[0];
my $be_format = $t->JBrowseEntry( -label => '', -variable => \$test_var, -choices => \@test_arr,
                                 -state => 'normal', -font => ['Tahoma', 8], -width => 10 );
my $lbl_hl = $t->Label( -text => 'Überschrift', -font => ['Tahoma', 9],);

$t->windowConfigure("-1,0", -window=>$cb_use);
$t->windowConfigure("0,0", -window=>$be_format);
$t->windowConfigure("1,0", -window=>$lbl_hl);

my $dnd_t = $t->DragDrop( -event => '<B1-Motion>',
                         -sitetypes => [qw(Local)],
                         -startcommand =>  sub { print "Dragged: ".(join(":", ($t->pointerxy))).
                                                       '   XScrollbar: '.(sprintf("%.2f", ($t->xview)[0]*100)).'%'.
                                                       '   YScrollbar: '.(sprintf("%.2f", ($t->yview)[0]*100)).'%'.
                                                       '   Widget Position: '.&get_cell_coords($t)."\n"; return 0; } );
my $ds_t = $t->DropSite ( -droptypes     => ['Local'],
                         -dropcommand   => sub { print "Dropped ".(join(":", ($t->pointerxy))).
                                                       '   XScrollbar: '.(sprintf("%.2f", ($t->xview)[0]*100)).'%'.
                                                       '   YScrollbar: '.(sprintf("%.2f", ($t->yview)[0]*100)).'%'.
                                                       '   Widget Position: '.&get_cell_coords($t)."\n"; } );

my $button = $top->Button( -text => "Exit", -command => sub{ $top->destroy } );      

$t->tagConfigure('OddRow', -bg => '#999999', -fg => 'black');
$t->colWidth( -2 => 7, -1 => 7, 1=> 5, 2 => 8, 4=> 14);

$label->pack( -expand => 1, -fill => 'both');
$t->pack(-expand => 1, -fill => 'both');
$button->pack(-expand => 1, -fill => 'both');

Tk::MainLoop;


Bei der X-Position muss man nur noch ein Offset abziehen, aber die Y-Position zeigt einfach immer nur 12 an. Suche jetzt seit 2 Stunden an dem Fehler, vielleicht seht ihr mehr..
Allerdings fehlen hier Sachen wie Window resizen usw.; mein Algo ist mehr als dürftig.. Hab ihn gut kommentiert, hoffe das hilft.

[UPDATE>>]
Habe die Dokumentation von Tk::TableMatrix jetzt zweimal druch; danach war der Quelltext dran: Jedesmal, wenn Mausposition nach Tabellenposition umgerechnet wird (komme nicht genau dahinter wie), kam XEvent ins Spiel. Also gleich mal in die DropSite ein print Dumper $t->XEvent; eingebaut. Ausgabe:
Code: (dl )
1
2
$VAR1 = bless( do{\(my $o = '&‼           &frac14;P&┘&☺$$Þ&☺$$Þ&☺    p&♣Æ|    m&♣Æ|Ì&┬&┐w  "
Ò&┬&┐w0B" &╚#Ò&☺   &┤ØÓ&☺{        ²@&☺Gµ7 l¯&▄&☺        X&♠&┘&☺l¯&▄&☺&frac14;*&▄&☺')}, 'XEvent' );

Nett ^^
Danach googlen hat auch nicht viel gebracht. Zeit fürs Bett, hab genug für heute.

[UPDATE2>>]
Bringt mich um den Schlaf der *******
Also: print $t->XEvent->x; und print $t->XEvent->y; gibt 0 bzw. wieder 0, egal wie sehr ich die Mausposition ändere. $top->... bringt beide Male 110.\n\n

<!--EDIT|GoodFella|1168661989-->
ptk
 2007-01-13 16:25
#46094 #46094
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es gibt auch XEvent->X und ->Y für die Position im Rootfenster, vielleicht geht das? Oder einfach nur $mw->pointerxy für die Mausposition? Dann musst du nur die Fensterposition abziehen.

Ein Dump von XEvent bringt immer nur binäres Zeug.
GoodFella
 2007-01-13 19:31
#46095 #46095
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,13.01.2007, 15:25]Es gibt auch XEvent->X und ->Y für die Position im Rootfenster, vielleicht geht das? Oder einfach nur $mw->pointerxy für die Mausposition? Dann musst du nur die Fensterposition abziehen.

Ein Dump von XEvent bringt immer nur binäres Zeug.[/quote]
Xevent->X bzw. Y bringt statisch folgenden Wert: 2009055966, egal wo ich clicke; und zwar als Methode von TableMatrix als auch von MainWindow.

Und wenn ich die Fensterpositionen voneinander abziehe, das gibt mir ja nur wieder Pixelkoordinaten.. ich brauch aber Reihe:Zeile-Format.. und zwar eins dass konsistent berechnet werden kann..
ptk
 2007-01-13 20:59
#46096 #46096
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hast du schon die @x,y-Syntax für Indices ausprobiert?
GoodFella
 2007-01-14 08:31
#46097 #46097
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Ja, index liefert einen scrollunabhängigen, von mir nicht nachvollziehbaren Wert zurück; hatte ich schon vorgestern probiert; ...Kannst es ja selber mal testen:

Code: (dl )
1
2
3
4
5
my $ds_t = $t->DropSite ( -droptypes     => ['Local'], 
                         -dropcommand   => sub { print "Dropped Main: ".(join(":", ($t->pointerxy))).' Table: '.(join(":", ($top->pointerxy))).
                                                       '   XScrollbar: '.(sprintf("%.2f", ($t->xview)[0]*100)).'%'.
                                                       '   YScrollbar: '.(sprintf("%.2f", ($t->yview)[0]*100)).'%'.
                                                       '   Widget Position: '.&get_cell_coords($t).'   XEvent: '.($t->XEvent->X).':'.($t->XEvent->Y).' Index: '.($t->index( '@'.(($t->pointerxy)[0]).','.(($t->pointerxy)[1]) )).' '."\n"; } );

Dieser Code macht mich fertig, bin direkt nach meinem Beitrag eingeschlafen.. ^^ .. grad erst wieder aufgewacht.\n\n

<!--EDIT|GoodFella|1168756438-->
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2007-01-09 21:27.